带缓存的引用计数android位图

带缓存的引用计数android位图,android,caching,bitmap,out-of-memory,Android,Caching,Bitmap,Out Of Memory,在安卓pre-honeycomb上,位图有奇怪的内存问题,因为它们的数据没有存储在虚拟机中。因此,GC不会跟踪或删除它。而是在调用Bitmap.recycle()时将其删除(这也会在Bitmap的终结器中自动完成) 这会导致在执行图像缓存时出现一些问题。当位图即将被逐出时,我不能简单地对其调用recycle(),因为我不知道是否有其他人在使用它 我的第一个想法是在加载每个位图之前执行System.gc()。这样,希望孤立的Bitmaps将最终确定,并释放本机内存。但是编辑:实际上它做了一些工作。

在安卓pre-honeycomb上,位图有奇怪的内存问题,因为它们的数据没有存储在虚拟机中。因此,GC不会跟踪或删除它。而是在调用
Bitmap.recycle()
时将其删除(这也会在
Bitmap
的终结器中自动完成)

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

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

我的下一个想法是实现手动引用计数,方法是对
Bitmap
进行子类化,并在所有活动的
onDestroy()方法中调用
ReferenceCountedBitmap.decrementCount()
。但我不能,因为位图是最终的

我现在正在计划一个
BitmapManager
,它将
WeakReference
保留到位图,并具有如下方法:

public void using(Bitmap bm);
public void free(Bitmap bm);
其中包括参考文献


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

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

在对位图调用
recycle()
之前,我首先将视图中的所有引用设置为null(否则将引发位图循环异常)

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