Volley缓存说明 — 一个请求两次回调
从上一篇文章Android 异步网络请求框架-Volley 了解volley的一些出来过程,当然也包含网络请求和缓存处理的流程,但是在此需要单独做一些说明。
我在使用过程中忽略了一个事情,就是一个网络请求可能会有两次结果回调,其实这个在上一篇文章中也有说明,只是没有特别说明,很容易被忽略。
当进行网络请求时,先会判断缓存,当缓存还未过期,但是需要刷新时,volley会先将缓存回调(*次),然后以*高优先级再次发起一个网络请求,若请求到的内容有变化时,会再次回调(第二次)。当然,如果请求到的内容没有变化(the server returned 304),则不会进行第二次回调。因为*次将缓存回调时已经将请求标记为回调过的:
// If the server returned 304 AND we delivered a response already,
// we're done -- don't deliver a second identical response.
if (networkResponse.notModified && request.hasHadResponseDelivered()) {
request.finish("not-modified");
continue;
}
当然,还有一点需要注明一下,如果缓存已经过期了,是不会进行回调的,也就是说过期的缓存等同于缓存不存在。但是,volley在初始化缓存是并没有对过期的缓存进行处理,个人觉得这里可以进行优化:
在初始化时,将已过期的缓存删除,好处:
1. 在请求时减小过期缓存的命中率(区别于在初始化之后才过期的缓存);
2. 减小不必要的内存和磁盘占用;
3. 提高缓存的使用率(在进行Lru删除缓存时,可能会清除了有用的缓存而保留了过期的缓存);