안드로이드 개발 질문/답변
(글 수 45,052)
한화면에서 많은 ImageView에 파일에서 읽은 Drawble 객체를 할당해서 사용하고 있습니다.
페이지가 바뀔 때마다 다른 이미지를 뿌리고 있구요...
그러다보니 아래와 같이 메모리 릭이 발생해서 앱이 뻣내요....
Drawble 메모리 해제하는 방법이 무엇인지 아시는 분 계신가요?
아니면 Bitmap 객체로 읽어들여 뿌려주고 recycle() 을 해야지 되는건가요...크헐 죽겠습니다.~~~
E/AndroidRuntime(26050): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
E/AndroidRuntime(26050): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(26050): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:44
7)
E/AndroidRuntime(26050): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory
.java:323)
E/AndroidRuntime(26050): at android.graphics.drawable.Drawable.createFromResourceStream(Drawa
ble.java:697)
E/AndroidRuntime(26050): at android.content.res.Resources.loadDrawable(Resources.java:1705)
E/AndroidRuntime(26050): at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
E/AndroidRuntime(26050): at android.widget.ImageView.<init>(ImageView.java:115)
페이지가 바뀔 때마다 다른 이미지를 뿌리고 있구요...
그러다보니 아래와 같이 메모리 릭이 발생해서 앱이 뻣내요....
Drawble 메모리 해제하는 방법이 무엇인지 아시는 분 계신가요?
아니면 Bitmap 객체로 읽어들여 뿌려주고 recycle() 을 해야지 되는건가요...크헐 죽겠습니다.~~~
E/AndroidRuntime(26050): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
E/AndroidRuntime(26050): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(26050): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:44
7)
E/AndroidRuntime(26050): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory
.java:323)
E/AndroidRuntime(26050): at android.graphics.drawable.Drawable.createFromResourceStream(Drawa
ble.java:697)
E/AndroidRuntime(26050): at android.content.res.Resources.loadDrawable(Resources.java:1705)
E/AndroidRuntime(26050): at android.content.res.TypedArray.getDrawable(TypedArray.java:548)
E/AndroidRuntime(26050): at android.widget.ImageView.<init>(ImageView.java:115)
2010.06.09 22:59:46
Drawable d = null;
try {
d = Drawable.createFromPath(path);
이런식으로 만들어서 버튼에 할당하고 있는데요
Drawable은 어떻게 릴리즈 시키나요?
2010.06.10 09:42:08
디바이스 종류가 뭔가요? 플랫폼 설정에 따라 MAX HEAP의 크기가 정해져있는데, Default는 16M입니다. 개별 어플에서는 바꿀 방법이 없는 걸로 알고 있습니다. 메모리를 줄이던지 Heap이 많이 설정된 디바이스를 사용하는 방법외에는 없지 않나 합니다.
2010.06.10 11:14:37
디바이스는 모토로이입니다...
ImageButton에 SDCard에 있는 이미지를 Drawble로 읽어서 할당하는 방식을 쓰고 있는데..
쓰고 난 후에 ImageButton의 이미지에 setBackgroundDrawable로 null을 할당하고 있습니다.
검색해보니 Null을 넣어서 해결했다는 얘기가 있어서요..~~ Heap을 보니 Objects가 줄어들지 않는걸로 봐서
메모리 해제가 안되는것 같은데.. 방법이 없나요....ㅠㅠ
2010.06.10 13:24:10
CreateDrawableFromPath()로 만들면 BitmapDrawable이 생성되어 리턴됩니다.
아래와 같이 Bitamap.recycle()을 호출하면 garbage collection이 일어나기 전에 bitmap 리소스 free가 가능하지 않나 합니다.
Drawable d= CreateDrawableFromPath()
if ( d instanceof BitmapDrawable ) {
BitmapDrawable bd = (BitmapDrawalbe)d;
Bitmap bm = bd.getBitmap();
bd.setBitmap(null);
bb.recycle();
}
2011.02.11 02:21:46
OutOfMemoryError bitmap size exceeds VM budget 관련해서 정리한 글입니다. http://www.androidpub.com/1282821 참고하세요
비트맵의 라이프사이클을 잘 고려하셔서 리사이클 하세요.
참고로 최근 1기가를 달고 나오는 얘들은 에뮬레이터보다 쓸수 있는 메모리가 더더더 큼니다.