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