在 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% 的市场。