在Android预蜂窝之前,Bitmaps存在奇怪的内存问题,因为它们的数据未存储在VM中。因此,GC不会跟踪或删除它。相反,它会在调用Bitmap.recycle()
时删除(这也会在Bitmap
的终结器中自动完成。)
这在进行图像缓存时会导致一些问题。当一个位图被驱逐时,我不能简单地在其上调用recycle()
,因为我不知道是否有其他人正在使用它。
我的第一个想法是在加载每个位图之前做System.gc()
。这样,希望孤立的Bitmap
将被最终确定并释放本机内存。但是it doesn't work。 编辑:实际上它确实有点工作。我把我的System.gc()
放在错误的地方,移动它后,将我的缓存大小减半(看起来像是一个非常小的2 MB未压缩的位图数据),我的应用程序似乎不再崩溃(到目前为止)!
我的下一个想法是通过在我的所有活动'Bitmap
方法中继承ReferenceCountedBitmap.decrementCount()
并调用onDestroy()
来实现手动引用计数。但我不能,因为Bitmap
是最终的。
我现在正计划BitmapManager
将WeakReference
保留在位图中,并使用以下方法:
public void using(Bitmap bm);
public void free(Bitmap bm);
计算参考文献。
有没有人有任何经验或建议处理这个?在你提出建议之前,我不能忽视80%的市场。
答案 0 :(得分:0)
好吧,我用位图管理器解决了这个问题,在那里我保存了引用视图。在类似地图的结构位图中 - >意见清单。
在我对位图调用recycle()
之前,我首先将视图中的所有引用设置为null(否则会抛出位图回收异常)。
正如您所说,手动垃圾收集不适用于蜂窝前的位图,因为它们是在本机堆中分配的,即使使用System.gc()
,您也无法在释放此内存时进行假设。