【问题标题】:Do I need to recycle BitmapDrawable我需要回收 BitmapDrawable
【发布时间】:2013-04-19 15:24:32
【问题描述】:

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

在 Android 2.3.3(API 级别 10)及更低版本上,使用 recycle() 是 受到推崇的。如果您在您的 应用程序,您可能会遇到 OutOfMemoryError 错误。回收() 方法允许应用尽快回收内存。

我想知道,对于BitmapDrawable,我是否需要像这样进行清理

bitmapDrawable.getBitmap().recycle()

如果不再需要?

【问题讨论】:

  • 您将在随机位置遇到 OOM 崩溃,并且堆栈将毫无意义。调试将是一场噩梦,您将不得不在不同场景之间运行堆测试,以找出内存累积发生的位置。您将需要大约 3 天的调试时间和 2 天的修复和测试时间。不要删除它。如果它在那里,它的存在是有原因的。
  • 为什么没人回答你的问题?

标签: android


【解决方案1】:

最好在不使用时回收位图。您可以在 onResume() 中加载 bimap 并在 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

【讨论】:

  • 我的意思是,对于 BitmapDrawable,这是执行回收的正确方法吗? - bitmapDrawable.getBitmap().recycle()
  • 您在执行相同操作时是否遇到任何异常或错误。如果不回收应该不是问题
  • 不。代码执行正常。只是,我不确定我怎么知道之前分配的内存是否被正确地释放了。
  • 如果您有内存泄漏,您可以使用 MAT Analyzer。 dalvik 虚拟机进行垃圾收集。如果你的堆大小正在增长,你可以检查 logcat。
【解决方案2】:

The documentation告诉你

这是一个高级调用,通常不需要调用,因为 正常的 GC 进程将在没有更多内存时释放此内存 对此位图的引用。

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

您添加的链接几乎可以告诉您为什么它之前和之后可能会有所帮助:

在 Android 2.3.3(API 级别 10)及更低版本上,支持像素数据 位图存储在本机内存中。它与位图分开 本身,存储在 Dalvik 堆中。本机中的像素数据 内存没有以可预测的方式释放,可能会导致 应用程序短暂超出其内存限制并崩溃。作为 Android 3.0(API Level 11),像素数据存储在Dalvik上 堆以及相关的位图。

【讨论】:

  • 这真的取决于你有多少数据。如果您有很多位图,尤其是具有双缓冲的屏幕大小的位图,您绝对需要调用回收或运行 OOM。如果你只有一堆图标,没有它你可能没问题。如果您要动态生成位图,我会说总是调用 recycle 以确保安全。
  • @GabeSechan 实际上,我自己使用它。但是,就像我在修改后的答案中提出的那样,强烈建议在 API 级别 10 之前和包括 API 级别 10 之前使用以及为什么之后没有必要使用是有原因的。
  • 我发现它在 10 级以上是必要的,可能更是如此。现在在处理大文件(如 10 MB pdf)时,由于 OOM 导致我有更多的崩溃,因为以前不计入有限 dalvik 堆的图像现在可以。
  • @DigCamara 你能引用同样的原因吗?为什么 api 级别 10 及以上不需要它?
  • @GabeSechan 他们总是计入堆。将固定内存移动到堆中使其效果更容易看到,它还允许 GC 收集位图内存而无需等待终结器运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多