如何在Android中实现内存图片缓存?

12

目前我在Android中使用软引用缓存来存储图片。该缓存用于显示在ListView中的图片,应当帮助将不在屏幕上显示但仍存在内存中的项目的图像保持在内存中,如果剩余内存足够的话。

问题在于,一旦最后一个硬引用被释放,软引用就会被几乎立即垃圾回收。这意味着从界面中移除的图像在那一刻就被垃圾回收了,如果用户再次滚动到该列表项时,图像会从内部手机存储器重新加载,导致复杂的延迟加载过程,频繁绘制列表和性能下降。

软引用行为的错误请求指出,这是预期行为,应该使用LRU (Least Recently Used) 缓存来缓存这种类型的内容。

现在我的问题来了。 LRU缓存将只使用我允许的内存量。但是,如果应用程序需要大量内存,它将不会释放内存。我应该如何确定可以允许缓存使用多少内存,并且是否有一种方法在手机存储器的内存情况变得紧张时减小缓存大小?

目前,图像缓存保存在应用程序中作为所有活动的全局图像存储。即使我的活动在后台或已销毁,这也会导致我的应用程序持续使用图像缓存的所有内存。

1个回答

3
保持后台进程的活跃是一种操作系统级别的优化,它使得切换回到你的进程变得更快。只有当操作系统可以承担内存时,你的进程才能保持活跃;当该内存需要为另一个应用程序所用时,你的进程将被终止并释放其资源。
如果每次你的进程在后台运行时都释放缓存,那么切换回你的应用程序将不再快速,因为会出现缓存未命中。这将打败 Android 的保持后台进程活跃的优化!
你应该使用 LruCache,它也包含在 Android Support Package 中,适用于 Android 3.0(Honeycomb)之前的版本。

我看不出使用 LruCache 如何解决缓存图像或任何其他 BLOB 的问题。问题在于其固定大小,每个条目都持有对缓存对象的强引用。这将无法随设备内存扩展而扩展。 - mxk
当LruCache的大小超过您设置的限制时,它会驱逐条目。您可以覆盖一个方法来帮助LruCache测量每个条目的大小。 - Jesse Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接