Do I need to recycle BitmapDrawable

4
根据http://developer.android.com/training/displaying-bitmaps/manage-memory.html,在Android 2.3.3(API级别10)及更低版本中,建议使用recycle()。如果应用程序中显示大量位图数据,则可能会遇到OutOfMemoryError错误。 recycle()方法允许应用程序尽快回收内存。我想知道,对于BitmapDrawable,是否需要执行清理操作?

bitmapDrawable.getBitmap().recycle()

如果不再需要?

2
你会在随机位置遇到OOM崩溃,而且堆栈信息毫无意义。调试将是一场噩梦,你必须在场景之间运行堆测试来找出内存积累发生的地方。你需要大约3天的调试和2天的修复和测试。不要删除它。如果它存在,那么它存在有其原因。 - Siddharth
为什么没有人回答你的问题? - ZaBlanc
2个回答

2

文档告诉你:

这是一个高级调用,通常不需要调用,因为正常的垃圾回收过程会在没有对此位图的引用时释放此内存。

所以我认为:不需要调用它。但是,请通过清除您拥有的引用来释放位图资源。

您添加的链接基本上告诉您为什么之前和之后可能会有所帮助:

在Android 2.3.3(API级别10)及更低版本中,位图的后备像素数据存储在本地内存中。它与位图本身分开存储在Dalvik堆中。本地内存中的像素数据无法以可预测的方式释放,可能导致应用程序短暂超出其内存限制并崩溃。从Android 3.0(API Level 11)开始,像素数据与相关位图一起存储在Dalvik堆中。


这真的取决于你有多少数据。如果你有很多位图,特别是具有双缓冲的屏幕大小位图,你绝对需要调用recycle或者会出现OOM错误。如果你只有一堆图标,那么可能不需要它。如果你正在动态生成位图,我建议总是调用recycle以保险起见。 - Gabe Sechan
@GabeSechan 实际上,我自己也使用它。但就像我在修改后的答案中所说的那样,使用API级别10及之前的原因是高度推荐的,而之后则不是那么必要了。 - DigCamara
我认为在10级及以上的水平上,这同样是必要的,甚至更加必要。现在当处理大文件(如10 MB的PDF文件)时,由于之前不计入有限Dalvik堆的图像现在也会计入其中,因此我遇到了更多的OOM崩溃。 - Gabe Sechan
@DigCamara 你能引用原因说明为什么在API级别10及以上不是必需的吗? - Raghunandan
@Raghunandan 我一直引用这个链接> Android 2.3 添加了并发垃圾回收,这意味着内存在位图不再被引用后很快被回收。 < 这和位图的放置方式意味着,只要没有引用,内存就应该被垃圾回收,无论您是否调用 recycle。 - DigCamara
2
@GabeSechan 它们总是计入堆内存。将固定内存移动到堆中使它们的影响更容易看到,也允许垃圾回收器在不等待运行终结器的情况下收集位图内存。 - Justin Breitfeller

2
最好在不使用时回收位图。您可以在onResume()中加载位图,然后在onPause()中回收它们。
因此,为了减少内存消耗并避免内存泄漏,最好在不使用时回收位图。
此外,请查看链接中的内存管理讲话。

http://www.youtube.com/watch?v=_CruQY55HOk

编辑:
你发布的链接中引用了一句话(你可以在“在Android 2.3.3及以下版本上管理内存”标题下查看)。
在Android 2.3.3(API级别10)及以下版本上,推荐使用recycle()。
从HoneyComb开始,位图存储在HEAP中,而不是它们的本机位图堆中。
Android 3.0(API级别11)引入了BitmapFactory.Options.inBitmap字段。如果设置了此选项,则采用Options对象的解码方法将尝试重用加载内容时现有的位图。这意味着位图的内存得到重复利用,从而提高了性能,并消除了内存分配和释放。

http://developer.android.com/training/displaying-bitmaps/manage-memory.html


3
我了解你的要求。针对BitmapDrawable,执行回收的正确方式是这样的吗?- bitmapDrawable.getBitmap().recycle() - Cheok Yan Cheng
在执行相同操作时是否遇到任何异常或错误?如果没有,回收应该不是问题。 - Raghunandan
不是的。代码正在正常执行。只是我不确定如何知道之前分配的内存是否被正确释放。 - Cheok Yan Cheng
如果你有内存泄漏问题,你可以使用MAT分析器。Dalvik虚拟机会进行垃圾回收。你可以通过logcat来检查堆大小是否在增长。 - Raghunandan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接