Android Bitmap.recycle();IllegalArgumentException:无法绘制回收的位图“;

Android Bitmap.recycle();IllegalArgumentException:无法绘制回收的位图“;,android,memory,bitmap,recycle,Android,Memory,Bitmap,Recycle,在标题为“”的文档中,您可以找到以下语句: 警告:只有在确定位图不再使用时,才应使用recycle()。如果调用recycle()并稍后尝试绘制位图,则会出现错误:“画布:尝试使用回收的位图” 那么,“不再”的确切含义是什么 我在fragments onCreateView(…)方法中调用setImageDrawable(drawable)。我在片段的onStop()中的可绘制位图上调用recycle()。 当用户现在通过启动另一个活动离开片段时,位图被回收。但是,当用户返回到前面的片段时,它的

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

警告:只有在确定位图不再使用时,才应使用recycle()。如果调用recycle()并稍后尝试绘制位图,则会出现错误:“画布:尝试使用回收的位图”

那么,“不再”的确切含义是什么

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

IllegalArgumentException: Cannot draw recycled bitmaps
所以,我似乎仍然处于“不再”的环境中。我什么时候可以得到一个新的位图,它是不可回收的?只有在碎片及其活动被完全摧毁之后

那么,“不再”的确切含义是什么

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

正如您所说,您正在onstop()上回收位图,请在onstop()中也尝试使用此选项


如果您想让一天过得愉快,请观看本官方视频的前20分钟-

您的位图将在您离开活动时自动获得GCD(只要您没有任何长期引用)。除非您需要在活动处于活动状态时管理多个位图(用于内存管理),否则无需手动回收它们。问题如下:应用程序有多个分区。在平板电脑上,大多数部分都有背景图像,填充整个屏幕。因此加载这样的图像需要大量内存。当用户切换到另一个部分时,上一个活动只会停止,而不会立即销毁(图像不是GCd)。因此,转到另一个部分时,会将另一个映像加载到堆中(堆会增长),依此类推。我已经在加载图像时对其进行了采样,但实际上这只会延迟OutOfMemory错误。因此,我在onStop()中调用recycle()和Runtime.gc()。但是,当用户返回到希望加载与以前相同(回收)图像的部分时,这会导致“无法绘制回收位图”。我得到了一切。我现在通过实现缓存机制解决了我的问题,如中所述。因此,在最初加载图像时,我将其放入缓存。然后在onStop()中,我循环使用它,运行GC(->释放内存),然后当相同的片段再次显示时,我从缓存中加载图像。由于图像非常大,我仍然对它们进行采样。由于这需要时间,所以将它们另外存储在磁盘缓存中是有意义的。那么,您现在的问题是什么?
   if(bitmap!=null)
   {
      bitmap.recycle();
      bitmap=null;
   }