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

原创 2015年09月28日 16:05:30

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

Volley二次封装,实现网络请求缓存

Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过得数据进行缓存,因此需要我们自己手动缓存。 一下就是我的一种思路,仅供参考 NetWorkHelper---对...
  • zxm317122667
  • zxm317122667
  • 2015年11月04日 11:13
  • 4799

Android Volley 获取磁盘已有缓存数据

从架构上我们可以看到,volley有设置缓存机制,当找不到数据缓存或数据缓存过期时,才会联网获取新的数据。Volley 本身有缓存机制,不仅仅默认缓存图片,也有缓存Json数据。通过手机文件管理软件,...
  • szlcw1
  • szlcw1
  • 2015年05月17日 21:39
  • 1227

Android Volley 获取磁盘已有缓存数据

经过学习,我们知道Volley的架构如下: 从架构上我们可以看到,volley有设置缓存机制,当找不到数据缓存或数据缓存过期时,才会联网获取新的数据。Volley 本身有缓存机制,不仅仅...
  • shizhesx
  • shizhesx
  • 2016年01月19日 14:50
  • 820

请注意,Volley已默认使用磁盘缓存

之前学习volley框架,用ImageLoader可以设置内存缓存,用一个LruCache,就可以避免OOM且图片读取速度快,爽极了。 后来想,如果只是内存缓存的话,那退出程序或者内存不够大了,...
  • asdzheng
  • asdzheng
  • 2015年01月26日 21:24
  • 4901

Android Volley 获取磁盘已有缓存数据

经过学习,我们知道Volley的架构如下: 从架构上我们可以看到,volley有设置缓存机制,当找不到数据缓存或数据缓存过期时,才会联网获取新的数据。Volley 本身有缓存机制,不仅仅...
  • shizhesx
  • shizhesx
  • 2016年01月19日 14:50
  • 820

Android Volley 获取磁盘已有缓存数据

从架构上我们可以看到,volley有设置缓存机制,当找不到数据缓存或数据缓存过期时,才会联网获取新的数据。Volley 本身有缓存机制,不仅仅默认缓存图片,也有缓存Json数据。通过手机文件管理软件,...
  • szlcw1
  • szlcw1
  • 2015年05月17日 21:39
  • 1227

请注意,Volley已默认使用磁盘缓存

之前学习volley框架,用ImageLoader可以设置内存缓存,用一个LruCache,就可以避免OOM且图片读取速度快,爽极了。 后来想,如果只是内存缓存的话,那退出程序或者内存不够大了,...
  • asdzheng
  • asdzheng
  • 2015年01月26日 21:24
  • 4901

Google网络框架Volley的使用,Cache-Control=no-cache时强制缓存的处理

Volley是Google在Google I/O 2013上发布的一个网络框架,主要功能:web接口请求,网络图片异步下载,支持缓存。volley只是定义了缓存以及Request的接口,具体实现可以自...
  • ljb_blog
  • ljb_blog
  • 2015年06月01日 17:41
  • 5933

volley 缓存清理不干净

公司做的框架使用的volley,这里做一下图片缓存的说明 使用步骤: 1.首先建立一个队列: private RequestQueue mRequestQueue; if (mRequestQu...
  • feiyukill
  • feiyukill
  • 2017年04月11日 15:13
  • 387

Volley的缓存策略

再读Volley第一次看Volley的代码的时候只是大概地理清了它的结构而没有做细节上的记录,但是看了这两篇文章之后,面试后的总结和Android网络请求心路历程,发现Volley还有很多可以学习的地...
  • CsL664867596
  • CsL664867596
  • 2016年03月14日 21:23
  • 1740
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Volley在没有网的情况下使用磁盘缓存的数据
举报原因:
原因补充:

(最多只允许输入30个字)