Bob
Bob

Reputation: 23000

Why I get Canvas: trying to use a recycled bitmap android.graphics?

I have 4 activities A, B, C and D.

Activity A has a menu. One of its options opens Activity D which has a list view. Activity A opens Activity B by a button. Activity B opens Activity C by a button.

Activity C has 4 ImageViews that I recycle them on finish.

When I do the following scenario every thing is OK:

A -> B --back to--> A --click Menu to go to D --> OK

When I do the following scenario I get this fatal exception:

A -> B -> C –back to--> B --back to--> A --click Menu to go to D --> get exception

There is no relation between Activity D and C. but why I get this exception here????

A->B->C (using buttons)

A-> D (using menu)

05-15 11:33:49.600: E/AndroidRuntime(2722): FATAL EXCEPTION: main
05-15 11:33:49.600: E/AndroidRuntime(2722): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@41326810
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:1038)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.graphics.Canvas.drawBitmap(Canvas.java:1142)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:393)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.widget.ImageView.onDraw(ImageView.java:924)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.View.draw(View.java:10983)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.drawChild(ViewGroup.java:2887)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.widget.ListView.drawChild(ListView.java:3223)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.widget.AbsListView.dispatchDraw(AbsListView.java:2092)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.widget.ListView.dispatchDraw(ListView.java:3218)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.View.draw(View.java:11088)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.widget.AbsListView.draw(AbsListView.java:3398)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.drawChild(ViewGroup.java:2887)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.View.draw(View.java:10986)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.drawChild(ViewGroup.java:2887)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.drawChild(ViewGroup.java:2885)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.View.draw(View.java:10986)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.widget.FrameLayout.draw(FrameLayout.java:450)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2126)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.os.Looper.loop(Looper.java:137)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at java.lang.reflect.Method.invokeNative(Native Method)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at java.lang.reflect.Method.invoke(Method.java:511)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-15 11:33:49.600: E/AndroidRuntime(2722):     at dalvik.system.NativeStart.main(Native Method)

Upvotes: 1

Views: 3565

Answers (2)

Bob
Bob

Reputation: 23000

I noticed I should not use same image resources for different Activities while one of them is recycling its bitmap.

I was using same image resource (img01.png) for ImageViews in both Activity C and Activity D.

I changed the image resource of Activity C to img02.png and problem solved.

But I do not know its logical reason.

Upvotes: 1

kabuko
kabuko

Reputation: 36302

Just because you backed out of an activity doesn't mean it's gone. If you're going to recycle bitmaps, make sure they aren't in use. You could set the ImageView to have a different (perhaps blank) Drawable when you recycle the bitmap.

Upvotes: 0

Related Questions