【问题标题】:trying to use a recycled bitmap android.graphics.Bitmap尝试使用回收的位图 android.graphics.Bitmap
【发布时间】:2012-12-17 15:29:00
【问题描述】:

我正在我的activity A 中显示一个 .gif。当用户按下一个按钮时,用户移动到activity b,并且在那里显示相同的.gif,但我在activity b 上收到“尝试使用回收的位图android.graphics.Bitmap”这个错误。

我正在显示来自 sd 卡和 onStop() 的 .gif 我将 activity aimageview 设置为 null 以及 activity A,但我无法解决此问题。

请在这种情况下提供帮助。

//原木猫

12-31 10:58:49.819: E/AndroidRuntime(20903): java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@405131c8
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:325)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.widget.ImageView.onDraw(ImageView.java:854)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.View.draw(View.java:6880)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.View.draw(View.java:6883)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.View.draw(View.java:6883)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.View.draw(View.java:6883)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.widget.FrameLayout.draw(FrameLayout.java:357)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1871)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewRoot.draw(ViewRoot.java:1542)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewRoot.performTraversals(ViewRoot.java:1269)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1883)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.os.Looper.loop(Looper.java:130)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at android.app.ActivityThread.main(ActivityThread.java:3737)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at java.lang.reflect.Method.invokeNative(Native Method)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at java.lang.reflect.Method.invoke(Method.java:507)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:894)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:652)
12-31 10:58:49.819: E/AndroidRuntime(20903):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 请给我们看一些代码和你的logcat。
  • 不看代码很难给你答案。然而发生了什么。当您将 ImageView 设置为 null 时,它可能会回收资源并回收位图。但如果您在活动 B 中解码位图,则不应出现此错误。如果您的图像很大并且您认为会出现 OOM 错误,请考虑使用位图选项并将图像解码为 ImageView 的大小
  • 我假设您正在使用 facebook 滑出库...这是因为在您用于滑出的库中回收了位图.. 我有同样的例外和我已经设法修复它..

标签: android


【解决方案1】:

这里已经提供了解决方案:Canvas: trying to use a recycled bitmap android.graphics.Bitmap in android

这个应该可以。否则,请查看链接以获取更多解决方案

if (mBitmap != null && !mBitmap.isRecycled()) {
    mBitmap.recycle();
    mBitmap = null; 
}

【讨论】:

    【解决方案2】:

    您可以在回收位图之前进行检查,例如:

    if (img != null && !img.isRecycled()) 
    {
     img.recycle(); 
     img = null;
     System.gc(); 
    }
    

    这里的img是位图。 试试这个类型错误就解决了。

    【讨论】:

    • 有时我希望有权“删除”某些用户,只是因为他们不接受答案!
    • @RvPanchal 有什么问题。在这段代码中?你能在这里解释一下吗?
    • @RvPanchal 你能把你的代码贴在这里吗.. 因为我已经检查过了.. 如果位图被回收然后回收它们.. 只需检查你的代码。
    • 这是我的代码 if(bi != null && !bi.isRecycled()){ bi.recycle();双=空; } bi = mPdfPage.getImage((Constants.SCREEN_WIDTH * 2), (Constants.SCREEN_HEIGHT * 2), clip, true, true); // SaveBitmap(bi, str);返回双;
    • 只是创建你的位图是可变的..你的问题解决了。因为你再次使用不可变位图进行修改。像 String .. 只需阅读一些关于可变位图和不可变位图的内容。你的问题解决了。这不是我的代码中的问题。
    【解决方案3】:

    尝试在您的代码或您使用的任何库中查找使用方法 recycle() 的参考。这表明有人正在回收仍在使用的不好的位图。只有当您绝对确定不再需要给定位图时,您才能安全地调用 recycle() 方法。

    当您处理位图缓存时,这通常是一个常见问题,不确定是否是您的情况。

    【讨论】:

    • 我已经尝试使用 recycle() 但这仅适用于 android 的 OS v 2.3 或更低版本。
    猜你喜欢
    • 2011-05-15
    • 2014-04-03
    • 2012-07-25
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 2013-07-12
    • 2011-03-03
    相关资源
    最近更新 更多