반응형
Android application을 개발하다 보면 bitmap을 써야 하는 경우가 종종 생기는데
이때 bitmap은 OS에서 제대로 관리를 해주지 않기 때문에 메모리 누수가 나지 않기 위해서는 별도의 관리를 해주어야 한다.
안드로이드 3.0 이하
Bitmap의 메모리가 Dalvik VM(달빅 가상머신)에 할당되는 것이 아니고 Native Heap영역에 할당되기 때문에 Bitmap이 VM의 GC(Garbage Collecting)의 대상이 되지 않는다. 즉, recycle()을 호출해줘야한다.
안드로이드 3.0 이상
Bitmap의 메모리가 VM에 할당되기 때문에 다른 객체들 처럼 참조를 끊는 것이 가능하며 참조를 끊으면 GC의 대상이된다. 즉, recycle() 을 호출하지 않아도 bitmap = null; 로 메모리를 환원할 수 있다.
(그래도 혹시 모르니 recycle()를 쓰는 것을 좀 더 추천한다.)
Bitmap을 멤버로 선언한 경우
public class activity extends Activity{
ImageView iv;
Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.imageview);
bitmap = BitmapFactory.decodeResource(R.drawable.icon);
iv.setImageBitmap(bitmap);
}
@Override
protected void onDestroy(){
bitmap.recycle();
bitmap = null;
super.onDestroy();
}
}
Bitmap을 멤버로 선언하지 않은 경우
public class activity extends Activity{
ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
iv = (ImageView)findViewById(R.id.imageview);
iv.setImageBitmap(BitmapFactory.decodeResource(R.drawable.icon));
}
@Override
protected void onDestroy(){
Drawable d = iv.getDrawable();
if(d instanceof BitmapDrawable){
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();
bitmap.recycle();
bitmap = null;
}
d.setCallback(null);
super.onDestroy();
}
}
Drawable.setCallback( null );
Activity 나 Fragment 의 종료시에는 View 에 bind 된 drawable 을 끊어주는 것도 중요하다.
즉, Drawable이 View 에 bind 되어 있고, View 는 다시 Context 를 통해 Activity 에게 bind 되어 있다는 의미이다.
이를 통해 메모리 릭의 가능성을 배제할 수 있다.
반응형
'Basic > Android' 카테고리의 다른 글
Android exception 모음 (0) | 2019.11.07 |
---|---|
Matrix를 이용한 resize bitmap in layout (0) | 2019.11.05 |
안드로이드 View Lifecycle (0) | 2019.11.02 |
Android matrix를 이용한 간단한 연습 (0) | 2019.11.02 |
안드로이드 Log 사용 방법 (0) | 2019.10.31 |