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

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

相关文章推荐

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

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

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

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

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

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

看Volley源码,对HTTP缓存机制分析

Volley是android官方实现的HTTP请求库,实现feizh
  • dxyoo7
  • dxyoo7
  • 2014年05月27日 16:06
  • 2955

Android的Drawable缓存机制源码分析

Android获取Drawable的方式一般是Resources.getDrawable(int),Framework会返回给你一个顶层抽象的Drawable对象。而在Framework中,系统使用了...

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

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

Part1:Volley磁盘缓存

CacheDispatcher CacheEntry和DiskBasedCacheCacheHeader DiskBasedCacheCountingInputStream 缓存的核心DiskBase...

Android Volley图片缓存机制结合DiskLruCache实现磁盘缓存

先给两个超级棒的连接 http://blog.csdn.net/guolin_blog/article/details/28863651 Android DiskLruCache完全解析,硬...
  • szlcw1
  • szlcw1
  • 2015年05月15日 16:11
  • 1286

Android Volley的请求封装,实现图片内存缓存(防止OOM),数据磁盘缓存,及清除磁盘缓存

平时经常用到Volley请求网络数据,因为它确实好用,简单方便,因为项目要求也不是很苛刻,所以。。。。 呃。。。程序员总会去重构自己的代码,这不,我自己研究源码和网上的一些方法,重构了自己方便用的代码...

Glide使用探索(二)——磁盘缓存无效化

Glide磁盘缓存无效化
  • dcsff
  • dcsff
  • 2017年03月02日 15:50
  • 778
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Volley在没有网的情况下使用磁盘缓存的数据
举报原因:
原因补充:

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