1. Drawable 의 Bitmap


Bitmap 의 실제 data 는 native heap 에 존재하며,

이 data 는 recycle 을 통해 다음 gc 가 발생할 때 memory 에서 해제 됩니다.

하지만 recycle 된 Bitmap 을 가지고 있는 Drawable 을 사용하는 View 가 draw 되면 exception 이 발생하게 됩니다.

기본적으로 Drawable 의 callback 을 null 로 설정해서 막을 수 있지만,

때로 callback 이 null 이더라도 draw 되는 경우가 존재하기 때문에,

BitmapDrawable 과 NinePatchDrawable 과 같이 많이 사용되는 Drawable 은

custom 으로 개발자 자신이 상속받아 만든 Drawable 로 사용하는 것이 좋습니다.


@Override

public void draw(Canvas canvas) {

if (_bitmap == null) return;

if (_bitmap.isRecycled()) return;

super.draw(canvas);

}


과 같이 사용해 주면 bitmap 이 recycle 되더라도 exception 이 발생하진 않습니다.



2. BitmapFactory 와 Resources


BitmapFactory 에서 Drawable 의 resource id 로 만들어지는 Bitmap 은

같은 resource id 라 하더라도 새로운 instance 로 만들어 지지만,

Resources 에서 Drawable 의 resource id 로 만들어지는 Drawable 의 Bitmap 은

같은 resource id 일 때는 cache 된 상태로 읽어지기 때문에 같은 instance 로 만들어 집니다.

즉, Resources 에서 만든 Drawable 의 Bitmap 을 recycle 할 때는 각별한 주의가 필요합니다.



3. NinePatchDrawable 의 Bitmap


final TypedValue typedValue = new TypedValue();

final Rect padding = new Rect();

inputStream = resources.openRawResource(id, typedValue);

Bitmap bitmap = BitmapFactory.decodeResourceStream(resources, typedValue, inputStream, padding, null);

byte[] chunk = bitmap.getNinePatchChunk();


을 통해 bitmap 을 생성하면 NinePatchDrawable 생성에 필요한 Bitmap 과 padding, chunk 값을 가져 올 수 있습니다.

마지막 String srcName 은 debug 를 위한 값이기 때문에 null 로 설정해도 됩니다.



4. WeakReference


Activity 의 memory leak 을 막기 위해 주로 사용되지만,

다른 reference 들도 기본적으로 가능한 한 WeakReference 로 설정해 주는 것이 좋으며,

strong reference 가 하나만 존재하는 경우 strong reference 를 null 로 설정하면 gc 가 일어날 때 memory 에서 해제 됩니다.



http://www.podotree.com/