Android Volley (Google IO 2013) 可以有一个用于一级缓存的位图缓存和一个用于二级缓存的磁盘缓存。我不清楚这是一个或选择还是一个/或选择。还想知道磁盘缓存与图像位图缓存的性能。我注意到 ImageLoader 似乎采用了磁盘缓存或位图缓存,但我也在某处读到它具有 1 级和 2 级缓存...
问问题
989 次
3 回答
1
开箱即用的 Volley 只有磁盘缓存(DiskBasedCache 类),但您可以提供自己的(实现 com.android.volley.Cache 接口)。Volley 中没有“位图缓存”这样的术语。默认情况下,所有数据(位图、文本等)都缓存在磁盘上。
于 2013-08-07T02:31:20.637 回答
0
我知道这是一个老问题,但我遇到了同样的问题,我花了几天时间阅读博客、观看视频并在 Volley 源代码中上下滚动以最终弄明白。因此,为了将来的参考,这里以最清晰的方式来解释:
- Volley 缓存每个响应,除非响应在其标头中明确说明“无缓存”或“无存储”。如果是,则不会被缓存,否则将根据响应头的“max-age”进行缓存。
- 上面的缓存系统 100% 有意义,因为如果服务器说响应将无效,那么您就可以为来自服务器端的每个响应设置过期日期(太棒了)。
- 如果您不喜欢上述缓存方法,您可以覆盖 volley 源代码中的相应代码部分,但强烈不推荐
- 上面提到的所有内容都使用 LRU 算法缓存在磁盘上,使其成为 L2。所以 volley 为每个请求(包括图像)内置了 L2 缓存
- 磁盘缓存阻塞 I/O。所以可以说用户非常快速地滑动您的 ListView 并且图像应该非常快速地加载,但是 I/O 阻塞了您的主线程,并且您在滚动时会看到一些烦人的跳跃。然后一个非阻塞(内存中)L1 缓存就派上用场了,正如您所见,它在处理图像时很有用。好的,Volley 中没有内置的 L1 缓存,但是如果您想使用 ImageLoader,您可以编写自己的代码并将其绑定到 ImageLoader。(不用麻烦,LruBitmapCache 名下已经有数千个可用,只需复制一个)
- 结论:设置您的服务器为您的响应发送适当的缓存数据(这很容易)并在 Volley 中为您的 ImageLoader 定义一个 LruBitmapCache,一切都完成了。您将拥有 L1 和 L2 缓存。如果 L1 失败 volley 检查 L2(磁盘),如果再次失败,则进行 RPC。
希望能帮助到你
于 2016-05-27T22:54:29.953 回答