12

到目前为止,我在 Android 中为图像使用SoftReference缓存。此缓存用于 ListViews 中显示的图像,如果剩余内存足够,则应有助于将未显示在屏幕上的项目图像保存在内存中。

这样做的问题是,软引用几乎在最后一个硬引用被释放的那一刻就被垃圾收集了。这样做的结果是,从屏幕上删除的图像此时会被垃圾收集,如果用户在 ListView 中滚动回此条目,则图像会从内部手机内存中重新加载,从而导致复杂的延迟加载过程,从而导致在频繁重绘列表和一般糟糕的表现。

软引用行为的错误请求指出这是预期的行为,您应该使用LRU-Cache来缓存此类内容。

知道我的问题。LRU 缓存只会占用我允许的内存。但是如果应用程序需要大量内存,它不会释放内存。我应该如何确定我可以允许缓存使用多少内存,如果手机内存情况变得紧张,有没有办法减少缓存的大小?

目前,图像缓存保存在应用程序中,作为所有活动的一种全局图像存储。这将导致我的应用程序不断使用图像缓存的所有内存,即使我的活动在后台或被破坏。

4

1 回答 1

3

保持后台进程处于活动状态是一种操作系统级别的优化,可以快速切换回您的进程。只要操作系统能够提供内存,您的进程就会保持活动状态;当另一个应用程序需要该内存时,您的进程将被终止并释放其资源。

如果您在每次进程处于后台时释放缓存,则切换回您的应用程序将不再快速,因为它会看到缓存未命中。这破坏了 Android 的 keep-background-processes-alive 优化!

您应该只使用LruCache,它也包含在Android 支持包中,用于 Android 3.0 (Honeycomb) 之前的版本。

于 2012-01-20T16:45:22.620 回答