2012-10-12 25 views
2

Android中的Bitmap内存问题导致我实现了一个自定义加载器和下载器类,它将从Web下载图像,存储本地副本,以及如果从本地副本请求创建Bitmap。我在SoftReference<T>列表保持这些使他们保持一会儿,然后垃圾回收,此时类的finalize()方法被称为:从终结器调用位图#recycle()会导致Android应用程序无提示终止

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进行测试。

回答

0

如果您失去了参考Bitmap,您实际上不需要致电recycle()Bitmap类已经覆盖finalize()并释放内存,所以你所做的是多余的。

此外,根据文档本身:

这是一种先进的呼叫,并且通常不需要叫,因为 正常GC过程中会释放此内存时,有没有更多的 引用这个位图。

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

+0

非常感谢,但苦涩的经历表明事实并非如此。我花了很长时间在另一个应用程序中追踪内存泄漏,这些应用程序可追踪到未循环的'Bitmap',我认为在我停止引用它们时会收集垃圾。 –