【发布时间】: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