java - WeakReference#get() 什么时候开始返回 null?

标签 java android reference garbage-collection weak-references

我想使用 WeakReference 作为 (android) 位图缓存的一部分,以便能够检查位图何时不再使用。

我的缓存的最大大小小于 Java 堆空间。当新位图溢出缓存时,它应该释放不再需要的位图。

我的问题:WeakReference 的 get() 方法何时返回 null?

  1. 一旦不再有对该对象的强引用? (并且 GC 还没有发生)
  2. 或者当 GC 运行并确定它们不再是对该对象的强引用时?

如果 2. 为真,那么我可能会遇到我的缓存可能已满并且 GC 由于某种原因最近没有运行的情况。

然后,即使我在上次 GC 运行后已经释放了引用,WeakReference#get() 仍会返回对象并且我的缓存不会清除它。

最佳答案

答案是,这取决于您使用的 Android 版本。在 2.3 时间框架的某个地方,Android 改变了它的处理或弱引用。以前,它会在 GC 运行时删除它们。从 2.3(2.3.3?)的某些版本开始,它会在最后一个强引用消失后立即开始删除它们。所以在现代版本的 Android 中,弱引用是没有用的。

在此更改之前,弱引用用于缓存。他们不再工作了。现在正确的方法是使用 LRUCache。如果您需要支持旧版本,请使用支持库向后移植 LRU 缓存。

经过一番搜索,我认为更改是在 3.0 中进行的,而不是 2.3。不过,解决方案是一样的。

关于java - WeakReference#get() 什么时候开始返回 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16721497/

相关文章:

.net - 从不同的文件夹加载 DLL 引用?

PHP 性能 : Copy vs. 引用

C++ 对类数据成员的引用

java - 使用 Java 解析一行的最佳方法是什么?

java - 不使用 ResultSetMetaData 从表中检索列名

android - 如何在EditText中显示格式化文本?

java - 在 XML 资源中存储 R.id.elements

android 闹钟在 onReceive 期间死亡

具有比其类更广泛访问级别的 Java 构造函数

JAVA正确的谷歌街景URL的纬度/经度坐标