1.需求
最近由于项目需求更改,所以之前的部分页面以及接口都得改变,出现Volley关于Cache的小问题是这么回事,产品需求将一页面改为 ViewPager + frament + PageIndicator 组合的页面,相信肯定不陌生吧。而我在项目中用到的组合方式则是将这种组合方式的PageIndicator 改为 Github开源控件magicIndicator,总共有四个页面,页面如下:
2.问题
由于四个页面对应的数据都来自同一接口,只是接口携带的其中一个参数不同来区分各页面,所以四个页面共用同一个Fragment类,只是创建时候传入的参数不一样即可,那么就有问题了。
当我手机网络未打开或网络不好的状态下,打开应用,由于我在代码里面是设置了如手机网络不通的情况下则加载缓存的数据,所以页面显示的数据为缓存中的数据,问题来了,四个页面显示的数据全是一样的;这就郁闷了,Volley的缓存搞的鬼。
赶紧查看关于Volley的源码,才得知Volley缓存是以url为标识,而我四个页面共用一个url,那么随着页面的切换,volley缓存的数据依次更新,当我网络未通的情况下,根据url去cache拿到的则是上一次保存的数据,四个页面都是上一次保存的数据,同一份数据;
老规矩,问题的原因找到了,那么就得解决了,翻看了Volley的 Cache/StringRequest/RequestQueue/Request 这4个类,考虑将缓存标识更改,尝试下是否行得通
3.解决
直接贴代码:
//手机网络不通的情况下,在volley的工具类里做如下处理
if (mRequestQueue.getCache().get(url+key)!= null){
ApiResponse data = new ApiResponse(new String(mRequestQueue.getCache()
.get(key).data).toString());}
//在成功回调的方法里存储cache
StringRequest request = new StringRequest(
Request.Method.POST,
url,
new Response.Listener() {
@Override
public void onResponse(String response) {
Cache.Entry entry = new Cache.Entry();
entry.data = response.getBytes();
mRequestQueue.getCache().put(url+key,entry);
iResponse.subscribeData(new ApiResponse(response));
}
},…总结:大致的思路是可以将 “entry”看成Map集合,然后在请求数据成功时,将对应的自行定义的key和数据Value put进 “ertry”,在网络不通状态下将根据 自行定义的key查询是否有对应的数据value,有则取出。