안드로이드 개발 질문/답변
(글 수 40,700)
안녕하세요 선후입니다.^^
다름이 아니라 비트맵 이미지를 너무 로딩해대서 메모리가 부족해서 FORCE CLOSE가 뜨는것 같은데,
해결할 수 있는 방법이 있을까요 ㅠㅠ
제가 쓰는 이미지들이 PNG 하고 JPG인데 레이아웃을 20개정도 깔아놓고 VISIBLE했다가 GONE했다가 하면서
이미지를 전환하고 있거든요.....
방법아시는분 좀 가르쳐주셧으면 감사하겠습니다.^^
--LOG--
06-09 12:55:42.342: ERROR/dalvikvm-heap(10237): 682240-byte external allocation too large for this process. |
06-09 12:55:42.342: ERROR/dalvikvm(10237): Out of memory: Heap Size=5511KB, Allocated=3064KB, Bitmap Size=18995KB |
06-09 12:55:42.342: ERROR/(10237): VM won't let us allocate 682240 bytes |
06-09 12:55:42.342: DEBUG/skia(10237): --- decoder->decode returned false |
06-09 12:55:42.342: DEBUG/AndroidRuntime(10237): Shutting down VM |
06-09 12:55:42.342: WARN/dalvikvm(10237): threadid=3: thread exiting with uncaught exception (group=0x4001b390) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): Uncaught handler: thread main exiting due to uncaught exception |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): java.lang.OutOfMemoryError: bitmap size exceeds VM budget |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:464) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:340) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.content.res.Resources.loadDrawable(Resources.java:1705) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.content.res.Resources.getDrawable(Resources.java:580) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.widget.ImageView.resolveUri(ImageView.java:548) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.widget.ImageView.setImageResource(ImageView.java:270) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at toast.andr.picturepuzzle.Hard_Play_Activity.show_whole_image(Hard_Play_Activity.java:899) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at toast.andr.picturepuzzle.Hard_Play_Activity.access$10(Hard_Play_Activity.java:882) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at toast.andr.picturepuzzle.Hard_Play_Activity$5.onClick(Hard_Play_Activity.java:877) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.View.performClick(View.java:2364) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.View.onTouchEvent(View.java:4179) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.View.dispatchTouchEvent(View.java:3709) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.app.Activity.dispatchTouchEvent(Activity.java:2068) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.view.ViewRoot.handleMessage(ViewRoot.java:1708) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.os.Handler.dispatchMessage(Handler.java:99) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.os.Looper.loop(Looper.java:123) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at android.app.ActivityThread.main(ActivityThread.java:4595) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at java.lang.reflect.Method.invokeNative(Native Method) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at java.lang.reflect.Method.invoke(Method.java:521) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) |
06-09 12:55:42.342: ERROR/AndroidRuntime(10237): at dalvik.system.NativeStart.main(Native Method) |
2010.06.09 13:10:47
저는 ImageView.setDrawable(null) 이런식으로 처리해서 안보이는 부분에선 이미지를 null로 셋팅하고 보여질 때 다시 셋팅하는 식으로 해결했었습니다. 도움이 되실지 모르겠네요^^
2010.06.09 13:11:49
20개를 전부 메모리에 로딩하면.. 당연히 뻗죠.
안드로이드는 heap 이 상당히 제한되어 있으니.. 조심하셔야 하구요
20개를 bitmap 으로 만들지 말고 file path 를 ArrayList 등으로 가지고 계시다가
현재 화면에 보이고 있는 놈만 Bitmap 으로 만들어서 뿌리세요.
뿌린 다음에 .recycle() 해 줘도 좋구요..
안드로이드는 heap 이 상당히 제한되어 있으니.. 조심하셔야 하구요
20개를 bitmap 으로 만들지 말고 file path 를 ArrayList 등으로 가지고 계시다가
현재 화면에 보이고 있는 놈만 Bitmap 으로 만들어서 뿌리세요.
뿌린 다음에 .recycle() 해 줘도 좋구요..