【问题标题】:Diff b/w bitmap.recycle() and bitmap=null区分黑白 bitmap.recycle() 和 bitmap=null
【发布时间】:2011-09-09 18:53:42
【问题描述】:

我处于使用 for 循环下载一组图像并将其转换为位图图像的情况。因此,为了避免 OutOfMemory 错误,我正在尝试回收位图。但不幸的是,我遇到了另一个例外,比如"View trying to use a recycled bitmap"

但我仍然可以使用bitmap=null 将使用的位图设为空。所以我的问题是,制作我的位图null 会帮助我释放使用的内存吗?还是我应该在代码的其他部分提供bitmap.recycle()

【问题讨论】:

标签: android bitmap out-of-memory


【解决方案1】:

没有保证强制垃圾收集的方法,只有一种使用System.gc() 建议垃圾收集的方法。由于位图像素数据存在于 dalvik 堆之外的本机内存中,因此提供本机函数(在本例中为 recycle())将使我们有机会确定(最终)清理此像素数据。请注意,当使用recycle() 时,您无法使用该位图进行更多操作。

您遇到的问题是您在位图上调用recycle(),而您仍在尝试使用该位图。

要回答您的问题,是的,在回收后将位图设置为 null 是个好主意,但也可能是多余的。使用完位图后,请务必尝试回收它们。

【讨论】:

  • Always try to recycle your bitmaps when you are done with them 这是我的问题。我应该在哪里提供回收。如果我尝试在 for 循环中提供应用程序崩溃。但我想尽可能多地回收利用。那么我在哪里可以找到我的回收方法。
【解决方案2】:

调用recycle() 向系统表明您已完成使用该资源并且系统现在可以释放它正在使用的非托管内存。一旦你以这种方式处理了资源,它的行为通常是不确定的(人们会合理地期望它不再工作)。

之后将引用设置为 null 有两个好处:

  • 当您尝试使用它们时,您不会有对不起作用的对象的过时引用
  • 垃圾收集器将知道清理位图对象的托管端,从而释放更多内存

【讨论】:

    【解决方案3】:

    只需在 onStop 方法上调用 bitmap.recycle() ......你将解决问题..

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2017-08-08
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多