如果我使用SoftReference将位图存储在hashmap中,SoftReference会在Bitmap上调用.recycle()吗?如果没有,那么在给定情况下(当位图在HashMap内部时)从内存中正确清除位图的方法是什么?
答案 0 :(得分:6)
来自Bitmap.recycle doc:
This is an advanced call, and normally need not be called,
since the normal GC process will free up this memory when there
are no more references to this bitmap.
所以,弱势地保持Bitmap就足够了。如果由于某种原因你需要积极地释放这个资源,你就会因为弱参考而运气不好。
修改
我不熟悉android中的Bitmap实现,但是可能会强制一个人明确处理Bitmap资源的事实是在堆上没有创建一些内存。因此,在不需要GC的情况下,该过程可能会耗尽内存。想象一下,一个小物件拿着一块大块的内存块,从其他地方开始。可以准备对象的最终化以释放内存,但VM没有理由使用GC,因此本机内存“丢失”。
但在这种情况下,弱引用也无济于事,因为它仅在gc之后处理。只有在这里有帮助的是明确的“回收”可能借助于引用计数。
答案 1 :(得分:5)
如果我使用SoftReference将位图存储在hashmap中,SoftReference会在Bitmap上调用.recycle()吗?
没有。如果代替Bitmap
存储String
或POJO,该怎么办?他们有recycle
方法吗?当然不。所以,问题是:SoftReference
是什么?
如果希望引用的对象保持活动状态,直到主机进程内存不足,则使用
SoftReference
。在收集器需要释放内存之前,该对象将无法进行收集。松散地说,绑定SoftReference
意味着“将对象钉住,直到你不能再使用它”。 (link)
您不必关心清除位图(调用recycle
方法);让SoftReference
完成它的工作。
答案 2 :(得分:0)
由于它是finalize()
方法,因此将在GC上释放位图的相关资源。 recycle()
是在没有等待的情况下释放资源,如果您知道不再需要它,那不是您的情况。您使用SoftReference
,因为如果内存不足,您想要回收图像。
答案 3 :(得分:-1)
如果WeakReference引用的对象将是GC'd,我假设这个whill会触发位图上的循环方法。但是我不确定,所以只是为了安全起见,你可以做一些事情,比如重写WeakReference类,制作一个Bitmap特定的WeakReference类,当它的参考是GC时调用了recycle方法。
解决方案应该是这样的,但它没有经过测试:
private final class WeakBitmapReference extends WeakReference<Bitmap> {
public WeakBitmapReference(Bitmap b) {
super(b);
}
public void clear() {
Bitmap b = get();
if (b != null && !b.isRecycled())
b.recycle();
super.clear();
}
}