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