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.
答案 0 :(得分:0)
如果您丢失了recycle()
的引用,则实际上无需致电Bitmap
。 Bitmap
类已经覆盖finalize()
并释放内存,因此您所做的事情是多余的。
另外,根据文档本身:
这是一个高级调用,通常不需要调用,因为 正常的GC过程将在没有更多时释放这个内存 对此位图的引用。
如果您不再需要位图,则存在回收,但无论出于何种原因,您需要保留引用(可能是您要使用要保留的额外元数据重载Bitmap对象)。如果您只是持有对Bitmap对象的引用,那么取消引用它就足够了。