Android OkHttp之 offline cache

来源:互联网 发布:淘宝恒源祥羊毛衫价格 编辑:程序博客网 时间:2024/04/30 15:48

OkHttp的执行函数execute() 拦截器部分的执行时序图,(假如默认我们给httpClient设置了2个拦截器)

这里写图片描述

HttpEngine->NetworkInterceptorChain_0:proceednote left:初始调用 index=0\n由HttpEngine.readResponse函数执行NetworkInterceptorChain_0->NetworkInterceptor_0:intercept(chain)note right:调用clinet的Interceptor队列中index=0的Interceptor\n这里可能对request做相应调整NetworkInterceptor_0->NetworkInterceptorChain_1:proceednote left:index=1NetworkInterceptorChain_1->NetworkInterceptor_1:intercept(chain)note right:调用clinet的Interceptor队列中index=1的Interceptor\n这里可能对request做相应调整NetworkInterceptor_1->NetworkInterceptorChain_2:proceednote left:index=2 我们默认只有两个Interceptor,\n那么到此会将前面两个Interceptor所装饰的request\n执行网络操作transport.writeRequestHeaders(request)\n然后Response response = readNetworkResponse()获得服务器响应NetworkInterceptorChain_2-->NetworkInterceptor_1:将服务器响应结果返还给第二个Interceptornote right:在该Interceptor中可以对响应数据response做相应调整NetworkInterceptor_1-->NetworkInterceptorChain_1:将服务器响应结果返还到NetworkInterceptorChain_1NetworkInterceptorChain_1-->NetworkInterceptor_0:将服务器响应结果返还给第一个Interceptornote left:在该Interceptor中可以对响应数据response做相应调整NetworkInterceptor_0-->HttpEngine:将服务器响应结果返还到NetworkInterceptorChain_0,\n然后就通过okHttp接口返回数据

那么离线缓存就是利用在拦截器中对服务器的响应的头部做出相应的修改来达到。

那么默认由服务器返回的头部数据摘录如下:

Expires: Mon, 26 Jul 1997 05:00:00 GMTLast-Modified: Mon, 07 Mar 2016 12:17:39GMTCache-Control: no-cache, must-revalidatePragma: no-cache

具体修改如下:

private OkHttpClient client;    private Interceptor interceptor = new Interceptor() {        @Override        public Response intercept(Chain chain) throws IOException {            Request request = chain.request();            Response response = chain.proceed(request);            String cacheControl = request.cacheControl().toString();            if (TextUtils.isEmpty(cacheControl)) {                cacheControl = "public, max-age=60";            }            return response.newBuilder()                    .header("Cache-Control", cacheControl)                    .removeHeader("Pragma")                    .build();        }    };     private void initHttpClient() {        Cache cache = getCache();        //创建OkHttpClient,并添加拦截器和缓存代码        client = new OkHttpClient();        client.networkInterceptors().add(interceptor);        client.setCache(cache);    }    @NonNull    private Cache getCache() {        //设置缓存路径        File httpCacheDirectory = new File(this.getCacheDir(), "responses");        //设置缓存 10M        return new Cache(httpCacheDirectory, 10 * 1024 * 1024);    }

当设置public, max-age=60,在收到服务器回复后60s时间内,无论启动多少次请求都只是读取本地缓存来作为回复内容。而超过60s后,就会启动一次向服务器的请求。

Header中的Pragma

刚开始没有去掉 Pragma字段,使得设置的cache机制没有任何作用。
Pragma 是HTTP/1.1之前版本的历史遗留字段,只作为向后兼容之用,而且其形式唯一:

Pragma:no-cache

一般发送的请求都会包含Pragma和Cache-Control.

测试如下

在请求初次响应后,继续反复请求,但是客户端并不重新发起请求,直到60s过后。
这里写图片描述

cacheControl = “public, max-age=10,max-stale=60”;
这里写图片描述

参考:

http://blog.csdn.net/picasso_l/article/details/50579884

0 1
原创粉丝点击