从终结器调用位图#recycle()会导致Android应用程序静默终止

时间:2012-10-12 16:53:54

标签: android bitmap recycle

Android中的Bitmap内存问题让我实现了一个自定义加载器和下载器类,它将从Web下载图像,存储本地副本,并在需要时创建Bitmap所以从本地副本。我将这些保存在SoftReference<T>列表中,以便它们保留一段时间,然后进行垃圾收集,此时调用类的finalize()方法:

protected void finalize() throws Throwable {
    Log.w("IMAGEPACK", "Finalizing " + mBitmap);
    if(mBitmap!=null&&!mBitmap.isRecycled()) mBitmap.recycle();
    super.finalize();
}

看看LogCat我已经确定这段代码正好在崩溃之前发生。我已经逐步完成了代码,它就在这一行上失败了。

我有一个以前使用同步引用计数的解决方案,这似乎非常可靠,但在我想避免这种情况之前,手动编写的引用计数存在很大问题。我可能不得不回复它,但我想知道为什么位图回收在这里失败。

我目前正在测试2.3.3上的三星Galaxy S.

1 个答案:

答案 0 :(得分:0)

如果您丢失了recycle()的引用,则实际上无需致电BitmapBitmap类已经覆盖finalize()并释放内存,因此您所做的事情是多余的。

另外,根据文档本身:

  

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

如果您不再需要位图,则存在回收,但无论出于何种原因,您需要保留引用(可能是您要使用要保留的额外元数据重载Bitmap对象)。如果您只是持有对Bitmap对象的引用,那么取消引用它就足够了。