我正在为我的 Android 应用程序实现缓存机制。
我使用 SoftReference
,就像我发现的许多示例一样。问题是,当我在 ListView
中向上或向下滚动时,大部分 图像已经被清除。我可以在 LogCat 中看到,每次应用程序加载新图像时,我的应用程序都会被垃圾收集。这意味着 ListView
中的大部分 不可见图像都消失了。
因此,每次我回滚到较早的位置(我之前真正下载过图像的位置)我都必须再次下载图像 - 它们不是 缓存。
我也研究过这个话题。 According to Mark Murphy in this article ,似乎存在(或曾经存在?)SoftReference
的错误。其他一些结果表示相同的事情(或相同的结果); SoftReference
清除得太早了。
有什么可行的解决方案吗?
最佳答案
SoftReference 是可怜的缓存。 JVM 可以让这些引用存活更长时间,但不是必须的。一旦不再有硬引用,JVM 就可以对软引用的对象进行垃圾回收。您遇到的 JVM 的行为是正确的,因为 JVM 不必长时间保留此类对象。当然,大多数 JVM 都试图在某种程度上让软引用对象保持 Activity 状态。
因此 SoftReferences 是一种危险的缓存。如果你真的想确保缓存行为,你需要一个真正的缓存。喜欢 LRU-cache .尤其是当缓存对性能至关重要时,您应该使用适当的缓存。
关于java - SoftReference 过早地收集垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757969/