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

使用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缓存机制的概念

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值