您的位置:首页 > 移动开发 > Android开发

Volley在没有网的情况下使用磁盘缓存的数据

2015-09-28 16:05 477 查看
使用Volley的应该都知道,Volley中的缓存机制是基于http cache的,简单来说就是它的缓存是依赖于服务器的。但是一般没有网时我们打开app,还是会展示最近一次展示的内容,所以,需要对它进行一下修改。

最开始想的是在CacheDispatcher中的run()中这样修改一下。但是一直不知道怎么来判断网络情况,所以这样的方法应该是不行的。

Cache.Entry entry = mCache.get(request.getCacheKey());
if (entry == null) {
request.addMarker("cache-miss");
// Cache miss; send off to the network dispatcher.
mNetworkQueue.put(request);
continue;
}

// 如果没有网络则直接将从磁盘中取到的数据进行解析,这里似乎无法来判断网络的情况
//      if(true)
//      {
//          Response<?> response = request.parseNetworkResponse(
//                  new NetworkResponse(entry.data, entry.responseHeaders));
//          mDelivery.postResponse(request, response);
//      }
然后思考一下,没网并且如果时间是超过了http cache缓存机制的时间话,那么出现的结果是会调用ErrorListener,从而可以找到是需要修改deliverError,deliverError则是在Request.java中的一个方法,那么最简单的方法就是自定义一个Request。

自定义一个StringRequest

public class MyStringRequest extends StringRequest {

public MyStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
}

@Override
public void deliverError(VolleyError error) {
if (error instanceof NoConnectionError) {
Cache.Entry entry = this.getCacheEntry();
if(entry != null) {
Response<String> response = parseNetworkResponse(new NetworkResponse(entry.data, entry.responseHeaders));
deliverResponse(response.result);
return;
}
}
super.deliverError(error);
}
}
自定义一个JsonObjectRequest

public class MyJsonObjectRequest extends JsonObjectRequest {
public MyJsonObjectRequest(int method, String url, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener)
{
super(method, url, listener, errorListener);
}

/*
* 没有网的情况也是出现了异常,然后就会调用到deliverError
* */
@Override
public void deliverError(VolleyError error) {
if(error instanceof NoConnectionError)
{
Cache.Entry entry = this.getCacheEntry();
if (entry != null)
{
Response<JSONObject> response = parseNetworkResponse(new NetworkResponse(entry.data, entry.responseHeaders));
deliverResponse(response.result);
return ;
}
}
super.deliverError(error);
}
}
这样都能很好的在没有网的情况下使用。

Http缓存机制的概念
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Volley 缓存