2

Android 中的Bitmap内存问题导致我实现了一个自定义加载器和下载器类,该类将从网络下载图像,存储本地副本,并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。

4

1 回答 1

0

recycle()如果您丢失了 be 的引用,您实际上不需要打电话Bitmap。该类Bitmap已经覆盖finalize()和释放内存,因此您正在做的事情是多余的。

此外,根据文档本身:

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

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

于 2012-10-12T17:10:51.190 回答