到目前为止,我正在为Android中的图片使用SoftReference缓存。此缓存用于ListView中显示的图像,如果有足够的内存,应该有助于保存内存中未显示在屏幕上的项目的图像。
问题在于SoftReferences几乎是在最后一个硬引用发布的时刻进行的垃圾收集。结果是,从屏幕上移除的图像在那时被垃圾收集,并且如果用户在ListView中滚动回到该条目,则从内部电话存储器重新加载图像,导致复杂的延迟加载过程,从而导致频繁重绘列表和一般性能不佳。
软引用行为的bug request表明这是预期的行为,您应该使用LRU-Cache来缓存此类内容。
知道我的问题。 LRU缓存只会占用我允许的内存量。但如果应用程序需要大量内存,则无法释放内存。我应该如何确定我可以允许缓存使用多少内存,如果手机的内存情况变得紧张,有没有办法减少缓存的大小?
目前,图像缓存作为一种所有活动的全局图像存储保存在应用程序中。这将导致我的应用程序不断使用图像缓存的所有内存,即使我的活动在后台或被破坏。
答案 0 :(得分:3)
保持后台进程处于活动状态是一种操作系统级优化,可以快速切换回您的进程。只要操作系统能够负担内存,您的进程就会保持活跃状态;当另一个应用程序需要该内存时,您的进程将被终止并且其资源将被释放。
如果您在每次进程处于后台时释放缓存,切换回应用程序将不再快速,因为它会看到缓存未命中。这打败了Android的keep-background-processes-alive优化!
您应该使用LruCache,Android Support Package也包含在Android 3.0(Honeycomb)之前的版本中。