我正在为我的Android应用程序实现缓存机制。

我使用SoftReference,就像我发现的许多示例一样。问题是,当我在ListView中向上或向下滚动时,图像中的大多数已被清除。我在LogCat中可以看到,每次应用程序加载新图像时,我的应用程序都会被垃圾回收。这意味着ListView中的不可见图像中的大多数都消失了。

因此,每次我滚动回到较早的位置(之前我确实下载过图像)时,我都必须再次下载图像-它们是而不是缓存的。

我也研究了这个话题。 According to Mark Murphy in this articleSoftReference似乎有一个(或曾经是)一个错误。其他一些结果表示相同的事物(或相同的结果); SoftReference清除得太早了。

有什么可行的解决方案吗?

最佳答案

SoftReference是可怜的人Cache。 JVM可以使这些引用的生存期更长,但不是必须的。一旦不再有硬引用,JVM便可以垃圾回收软引用的对象。您所遇到的JVM的行为是正确的,因为JVM不必长时间保持此类对象。当然,大多数JVM都会尝试在一定程度上保持软引用对象的生命。

因此,SoftReferences是一种危险的缓存。如果您确实要确保缓存行为,则需要一个真正的缓存。就像LRU-cache一样。特别是如果您的缓存对性能至关重要,则应使用适当的缓存。

关于java - SoftReference太早收集到垃圾了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5757969/

10-12 02:15