마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

fatal 에러 발생할때는 어떻게 하는게 좋을까요??

0 추천
bitmap에 이미지를 넣고 여러장 볼수 있게 해놨는데 이미지 용량이 큰이 50장 정도 보면 heep용량이 다돼서 앱이 죽어서 
recycle을 넣어서 메모리 해제를 해주었습니다.
근데 이미지 한 20장 정도 보다가 보니 fatal에러가 발생하네요...
아시는 분 있으시면 알려주시면 감사하겠습니다.
 
FATAL EXCEPTION: main
java.lang.IllegalArgumentException: Cannot draw recycled bitmaps
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:778)
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:117)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)
at android.widget.ImageView.onDraw(ImageView.java:979)
at android.view.View.draw(View.java:13458)
at android.view.View.getDisplayList(View.java:12409)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
at android.view.View.getDisplayList(View.java:12407)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
at android.view.View.draw(View.java:13461)
at android.view.View.getDisplayList(View.java:12409)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
at android.view.View.getDisplayList(View.java:12407)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
at android.view.View.getDisplayList(View.java:12407)
at android.view.View.getDisplayList(View.java:12453)
at android.view.View.draw(View.java:13182)
at android.view.ViewGroup.drawChild(ViewGroup.java:2929)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2799)
at android.view.View.draw(View.java:13461)
at android.widget.FrameLayout.draw(FrameLayout.java:467)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2183)
at android.view.View.getDisplayList(View.java:12409)
at android.view.View.getDisplayList(View.java:12453)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1144)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2147)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2019)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1830)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreographer.java:525)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)

 

캐드카 (970 포인트) 님이 2013년 7월 11일 질문

1개의 답변

0 추천
저 메세지는 Recycle로 메모리가 해제 되었는데, 그걸 표시해주려고 시도 해서 나오는 에러 같습니다. Recycle한 이미지를 더이상 화면에 표시 안하도록 확인해보세요
bbirec (2,120 포인트) 님이 2013년 7월 11일 답변
그럼 메모리 해제 된것을 다시 화면에 표시할려고 하면 다시 정의를 해줘야 하나요??
네 그렇습니다.
http://developer.android.com/training/displaying-bitmaps/manage-memory.html
여기를 참고해 보세요~
다시 정의를 해도 같은 이미지인것을 알고 다시 죽이네요....
재사용해야되는 비트맵은 recycle하면 안됩니다.
bitmap를 recycle하고 새로생성해주고 하는것보다 bitmap을 계속 재사용하는게 좋습니다.
액티비티가 완전히 종료되거나 더이상 사용안되는게 확실할때만 recycle해주시구요.
이미지 용량을 줄이면서 크게 보이는 다른 방법이 또 있을까요??
recycle써서는 띄울수가 없는거 같네요.
이미지 용량과 관계없이 화면 픽셀에 따라서 용량이 결정됩니다.
즉 용량을 줄여도 width height를 재설정해서 보내주면 메모리 차지용량은 똑같다는거죠.
방법으로는 알파값을 없애주는 방법이 있는데, BitmapFactory.Options에 ARGB_8888이 기본으로 되어있을텐데, 알파값이 굳이 필요없는 경우는 RGB_549 인가 그걸로하면 용량이 반으로 줄어듭니다.
 비트맵 용량줄이는 법은 구글링해보면 많이나와요..
createScaledBitmap 메소드를 안쓰는 방법으로 해결했습니다.
구글때문에 고생 많이 하네요...
여러가지 알려주셔서 감사합니다.

다른분들이 혹시 볼까해서
4.1.1 이상버전에서는 createScaledBitmap, createBitmap 으로 이미지를 크게 하면 절대로 안된다는점 크게 할꺼면은 위 메소드를 사용하지 않고 다른 방법으로 할것 !!
...