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

Dan*_*ich 19 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"
/>
Run Code Online (Sandbox Code Playgroud)

我对这个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)
Run Code Online (Sandbox Code Playgroud)

Abi*_*ash 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;
Run Code Online (Sandbox Code Playgroud)

注意:profileWallpaper是您的imageView对象

  • 这可能是一个很好的解决方法,但实际的解决方案是知道为什么应该使用的位图已被回收,否则您无法向用户显示所需的位图. (2认同)

Zap*_*scu 6

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

  • 它可能与您的问题无关,但尽量不要使用 android:src="@drawable/splashscreen",它会产生内存泄漏。如果在你,我应该尝试以编程方式加载/卸载图像背景。如果您没有显式调用 recycle() ,也许 GONE 参数会为您完成,我不会使用它,只是 recycle() 位图。 (2认同)