2

在 Android pre-honeycomb 上,位图存在异常的内存问题,因为它们的数据没有存储在 VM 中。因此,GC 不会跟踪或删除它。相反,它在Bitmap.recycle()被调用时被删除(这也在Bitmap' 终结器中自动完成)。

这在进行图像缓存时会导致一些问题。当一个位图要被驱逐时,我不能简单地调用recycle()它,因为我不知道是否有其他人在使用它。

我的第一个想法是System.gc()在加载每个位图之前做。这样,希望孤立Bitmap的 s 将被最终确定并释放本机内存。但它不起作用编辑:实际上它确实有点工作。在移动它并将我的缓存大小减半(看起来像是一个小得可笑的 2 MB 未压缩位图数据)之后,我System.gc()的位置错了,我的应用程序似乎不再崩溃(到目前为止)!

我的下一个想法是通过子类化Bitmap和调用ReferenceCountedBitmap.decrementCount()我所有活动的onDestroy()方法来实现手动引用计数。但我不能因为Bitmap是最终的。

我现在正在计划一个BitmapManager保留WeakReference's 位图的方法,并且具有以下方法:

public void using(Bitmap bm);
public void free(Bitmap bm);

计算引用。

有没有人有任何处理这个问题的经验或建议?在你建议之前,我不能忽视 80% 的市场。

4

1 回答 1

0

好吧,我用位图管理器解决了这个问题,我在其中保存了引用视图。在类似地图的结构位图 -> 视图列表中。

在调用recycle()位图之前,我首先将视图中的所有引用设置为 null(否则会抛出位图回收异常)。

正如您所说,手动垃圾收集不适用于蜂窝前的位图,因为它们是在本机堆中分配的,即使System.gc()您无法假设何时释放此内存。

于 2012-11-30T20:27:23.890 回答