引用计数带有缓存的android位图

时间:2012-11-30 10:36:14

标签: android caching bitmap out-of-memory

在Android预蜂窝之前,Bitmaps存在奇怪的内存问题,因为它们的数据未存储在VM中。因此,GC不会跟踪或删除它。相反,它会在调用Bitmap.recycle()时删除(这也会在Bitmap的终结器中自动完成。)

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

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

我的下一个想法是通过在我的所有活动'Bitmap方法中继承ReferenceCountedBitmap.decrementCount()并调用onDestroy()来实现手动引用计数。但我不能,因为Bitmap是最终的。

我现在正计划BitmapManagerWeakReference保留在位图中,并使用以下方法:

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

计算参考文献。

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

1 个答案:

答案 0 :(得分:0)

好吧,我用位图管理器解决了这个问题,在那里我保存了引用视图。在类似地图的结构位图中 - >意见清单。

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

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