【问题标题】:Bitmap.recycle() - "IllegalArgumentException: Cannot draw recycled bitmaps"Bitmap.recycle() -“IllegalArgumentException:无法绘制回收的位图”
【发布时间】:2013-08-31 16:57:02
【问题描述】:

在标题为“Managing Bitmap Memory”的文档中,您可以找到以下语句:

注意:只有在确定不再使用位图时才应使用 recycle()。如果您调用 recycle() 并稍后尝试绘制位图,您将收到错误:“画布:尝试使用回收的位图”。

那么,“不再”究竟是什么意思?

我在我的片段 onCreateView(...) 方法中调用 setImageDrawable(drawable)。我在片段的onStop() 中的drawable 位图上调用recycle()。 当用户现在通过启动另一个活动离开片段时,位图将被回收。但是当用户回到前一个片段时,它的 onCreateView() 会再次被调用,从而导致对“setImageDrawable(drawable)”的新调用。这会抛出:

IllegalArgumentException: Cannot draw recycled bitmaps

所以,我似乎仍然处于“不再”的环境中。我什么时候可以得到一个没有被回收的新位图?只有在片段及其活动被完全破坏之后?

【问题讨论】:

  • 当您离开活动时,您的位图将自动被 GCed(只要您没有任何长期存在的引用)。除非您需要在 Activity 处于活动状态时管理许多位图(用于内存管理),否则无需手动回收它们。
  • 问题如下:该应用程序有多个部分。在平板电脑上,大多数部分都有背景图像,填满屏幕。所以加载这样的图像会占用大量内存。当用户切换到另一个部分时,之前的活动只是停止,不会立即销毁(图像不是GCd)。所以来到另一个部分将另一个图像加载到堆中(它会增长)等等。我已经在加载图像时对其进行了采样,但实际上这只会延迟 OutOfMemory 错误。
  • 因此我在 onStop() 中调用了 recycle() 和 Runtime.gc()。但是当用户回到想要加载与以前相同(回收)图像的部分时,这会导致“无法绘制回收位图”。

标签: android memory bitmap recycle


【解决方案1】:

那么,“不再”究竟是什么意思?

不再意味着您不会使用相同的位图引用。

正如您所说,您正在 onstop() 上回收位图,请在您的 onStop() 中尝试使用它

   if(bitmap!=null)
   {
      bitmap.recycle();
      bitmap=null;
   }

Bitmap and outOfMemory in android

如果您想让您的一天过得愉快,请观看此官方视频的前 20 分钟 - http://www.youtube.com/watch?v=_CruQY55HOk

【讨论】:

  • 嗨,Tarun,我看过这个视频。我得到了一切。我现在通过实现Displaying Bitmaps Efficiently 中记录的缓存机制解决了我的问题。因此,在最初加载图像时,我将其放入缓存中。然后在 onStop() 中回收它,运行 GC(-> 释放内存),稍后当再次显示相同的片段时,我从缓存中加载图像。由于图像非常大,我仍然对它们进行采样。由于这需要时间,因此将它们另外存储在磁盘缓存中是有意义的。
  • 那你现在的问题是什么?
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-07
相关资源
最近更新 更多