Android试图使用回收的位图,而不是我的代码

时间:2011-07-22 14:46:55

标签: android bitmap

我偶尔会从Market开发者控制台获得这个堆栈跟踪;我找不到任何方法来重现错误。在应用程序首次加载时显示启动画面ImageView时会发生这种情况,但堆栈跟踪没有任何代码。我甚至认为我的活动甚至没有达到onCreate,但没有日志就很难说。

实际上,我从未在代码中的任何地方使用过Bitmap;我对图像的唯一引用是在我的layout.xml中。

<ImageView android:id="@+id/splashScreen"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:src="@drawable/splashscreen"
  android:scaleType="fitXY"
/>

我对这个ImageView做的唯一事情就是在我完成启动时将其可见性设置为GONE

我能做些什么吗?

java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap@4721ec18
at android.graphics.Canvas.throwIfRecycled(Canvas.java:955)
at android.graphics.Canvas.drawBitmap(Canvas.java:1044)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:323)
at android.widget.ImageView.onDraw(ImageView.java:923)
at android.view.View.draw(View.java:6761)
at android.view.ViewGroup.drawChild(ViewGroup.java:1663)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.View.buildDrawingCache(View.java:6517)
at android.view.View.getDrawingCache(View.java:6305)
at android.view.ViewGroup.drawChild(ViewGroup.java:1588)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1409)
at android.view.View.draw(View.java:6764)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1663)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.View.draw(View.java:6764)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at android.view.ViewGroup.drawChild(ViewGroup.java:1663)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.ViewGroup.drawChild(ViewGroup.java:1661)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1390)
at android.view.View.draw(View.java:6764)
at android.widget.FrameLayout.draw(FrameLayout.java:352)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1887)
at android.view.ViewRoot.draw(ViewRoot.java:1432)
at android.view.ViewRoot.performTraversals(ViewRoot.java:1167)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1764)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5068)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)

6 个答案:

答案 0 :(得分:8)

当您尝试回收或使用回收的位图时,会发生此异常。您不应该从现有代码中删除bitmap.recycle()函数,它可能会导致内存不足错误。您可以尝试以下代码来解决问题。

BitmapDrawable bitmapDrawable = ((BitmapDrawable) profileWallpaper.getDrawable());

                if (null != bitmapDrawable && !bitmapDrawable.getBitmap().isRecycled()) {

                    bitmapDrawable.getBitmap().recycle();
                } else {

                    log("bitmap is already recycled");
                }

                bitmapDrawable = null;

注意:profileWallpaper是您的imageView对象

答案 1 :(得分:6)

如果您在代码中的某处回收位图,则应确保在应用重新启动时重新创建位图。 当您通过onCreate时没有问题,但是当应用处于暂停状态并重新启动时,它将不再通过onResume再次通过onCreate。 我认为你可以在onResume方法中重新创建你的位图,但是使用一个标志在onCreate或onResume中创建位图,而不是两者(当应用程序启动时,onCreate和onResume被一起调用,你可能会浪费CPU周期)。 / p>

答案 2 :(得分:0)

您不应该为不同的活动使用相同的图像资源,而其中一个活动正在回收其位图。

如果遇到这种情况,请更改其中一个活动的图像资源。

答案 3 :(得分:0)

您是否尝试降低图像的重量?它发生在我身上很多次。如果在重新确定图像后问题仍然存在,则意味着问题出现在其他地方......我会查看主要活动或启动画面代码中的on create methode。

对不起我糟糕的英语:)

是的,你好!

答案 4 :(得分:0)

刚刚解决了类似崩溃日志的问题。就我而言,它只是片段中的第二个ProgressBar。我里面有两个列表,每个列表都有ProgressBars。删除第二个解决了问题。我只能猜测他们使用相同的位图资源进行背景或动画......

我花了很多时间来理解它的原因,它只是一个标准的ProgressBar! :/ 希望这有助于节省时间和安心。

答案 5 :(得分:0)

我有同样的Exception来自我的申请,并发现它与AdMob无关。

当您将通过XML设置的BitmapDrawable资源回收到ImageView时,会出现此问题。

在恢复时,android无法再次解码图像,无论它是否被回收,因此,您将获得Canvas: trying to use a recycled bitmap

解决此问题的方法是重新加载BitmapDrawable onPause的{​​{1}}对应的Activity,以便android不会抱怨重新映射的位图。

以下是如何操作:

Bitmap selectImage = BitmapFactory.decodeResource(getResources(), R.drawable.your_bitmap_drawable);
yourImageView.setImageBitmap(selectImage);

修改 我意识到只需将Drawable yourImageView设置为null也可以防止此错误。只是不要留下已回收Drawable的{​​{1}}。示例代码:

Bitmap