안드로이드 개발 정보
(글 수 1,064)
안드로이드 어플을 개발할 때 허용되는 힙 사이즈는 디바이스마다 다르긴 하지만 대략 15메가 내외로 제한적입니다.
이 상황에서 카메라 어플이나 포토에딧 어플과 같은
큰 이미지를 제어한다던지, 겔러리나 리스트 뷰에서 다량의 이미지를 제어하는 경우,
거의 대부분 out of memory 문제를 접하게 됩니다.
이런 경우에 대해서 잘 정리된 사이트가 있어서 먼저 소개 합니다.
http://cking4w.tistory.com/455
http://www.ibm.com/developerworks/kr/library/j-jtp11225/
대부분의 메모리 문제의 경우, Bitmap recycle 과 Drawable callback 을 null 로 맞추어서 해결할 수 있습니다만,
겔러리나 리스트뷰의 경우 ListAdapter 에서 생성하는 View 를 제대로 unbind 를 해주지 않는다면 메모리 문제가 발생할 수 있습니다.
특히 BitmapDrawable 과 NinePatchDrawable 을 명확하게 구분해서 사용해야 하는데,
메모리를 많이 사용하는 어플의 경우 힙 사이즈 제한으로 인해 bitmap 을 개발자가 create / recycle 하면서 메모리를 관리하게 되는데,
NinePatchDrawable 을 사용한 경우 해당 bitmap 을 개발자가 recycle 할 수 있는 방법이 없기 때문에
bitmap create / recycle 이 필요한 경우 BitmapDrawable 을 사용해야 하는 경우가 있습니다.
또한 ListAdapter 의 경우, 항상 view 를 새로 생성하는 방식은 피해야 하며,
일반적으로 convertView 를 사용하지만, 때에 따라서 개발자가 직접 view instance 를 관리하는게
메모리 관리에 있어서는 더 명확해 보일 수도 있습니다.
또한 activity 의 onPause 에서 메모리를 해제할 것들과 onDestroy 에서 메모리를 해제할 것들을 구분해야 하며,
activity 를 start 할 때 flag 를 어떻게 줄 것인지도 같이 고민을 해야
background 에 있는 activity 의 메모리로 인해, 현재 activity 에서 out of memory 가 발생하는 문제도 해결 할 수 있을 것입니다.
감사합니다.
http://floo.co.kr/
2010.09.27 19:51:39
BitmapDrawable하고 NinePatchDrawable을 구분하는게 아니고...
리소스에서 얻은 bitmap하고 일반 파일에서 얻은 bitmap을 구분하는거 아닌가요?
리소스에 그냥 png 넣어도 강제 recycle하면 오류나지 않나요?
2010.09.30 13:20:51
말씀하시는 것처럼 리소스로 bitmap 을 만들면 몇번씩 만들거나,
심지어 다른 activity 에서 만들어도 같은 bitmap instance 가 튀어 나오게 됩니다.
draw 에서 나오는 exception 은 bitmap 을 recycle 한 시점이
callback 을 통해 draw 되는 시점보다 이전일 때 발생하게 됩니다.
그래서 BitmapDrawable 에 존재하는 bitmap 을 recycle 하려면,
먼저 callback 을 null 로 셋팅해 줘야 합니다.
또한 callback 에는 context instance 도 있기 때문에
onDestroy 에서 되도록 callback 을 null 로 셋팅해 주는 것이 좋습니다.
하지만, 같은 리소스를 여러 activity 에서 사용할 때 같은 bitmap instance 를 recycle 할 수 있기 때문에 주의가 필요합니다.