Android OkHttp之 offline cache
2016-03-07 21:10
429 查看
OkHttp的执行函数execute() 拦截器部分的执行时序图,(假如默认我们给httpClient设置了2个拦截器)
那么离线缓存就是利用在拦截器中对服务器的响应的头部做出相应的修改来达到。
那么默认由服务器返回的头部数据摘录如下:
具体修改如下:
当设置public, max-age=60,在收到服务器回复后60s时间内,无论启动多少次请求都只是读取本地缓存来作为回复内容。而超过60s后,就会启动一次向服务器的请求。
Pragma 是HTTP/1.1之前版本的历史遗留字段,只作为向后兼容之用,而且其形式唯一:
一般发送的请求都会包含Pragma和Cache-Control.
cacheControl = “public, max-age=10,max-stale=60”;
HttpEngine->NetworkInterceptorChain_0:proceed note 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:proceed note left:index=1 NetworkInterceptorChain_1->NetworkInterceptor_1:intercept(chain) note right:调用clinet的Interceptor队列中index=1的Interceptor\n这里可能对request做相应调整 NetworkInterceptor_1->NetworkInterceptorChain_2:proceed note left:index=2 我们默认只有两个Interceptor,\n那么到此会将前面两个Interceptor所装饰的request\n执行网络操作transport.writeRequestHeaders(request)\n然后Response response = readNetworkResponse()获得服务器响应 NetworkInterceptorChain_2-->NetworkInterceptor_1:将服务器响应结果返还给第二个Interceptor note right:在该Interceptor中可以对响应数据response做相应调整 NetworkInterceptor_1-->NetworkInterceptorChain_1:将服务器响应结果返还到NetworkInterceptorChain_1 NetworkInterceptorChain_1-->NetworkInterceptor_0:将服务器响应结果返还给第一个Interceptor note left:在该Interceptor中可以对响应数据response做相应调整 NetworkInterceptor_0-->HttpEngine:将服务器响应结果返还到NetworkInterceptorChain_0,\n然后就通过okHttp接口返回数据
那么离线缓存就是利用在拦截器中对服务器的响应的头部做出相应的修改来达到。
那么默认由服务器返回的头部数据摘录如下:
Expires: Mon, 26 Jul 1997 05:00:00 GMT Last-Modified: Mon, 07 Mar 2016 12:17:39GMT Cache-Control: no-cache, must-revalidate Pragma: 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”;
参考:
/article/9188627.html相关文章推荐
- 如何在caffe中自定义网络层
- java后台訪问url连接——HttpClients
- TCP/IP各个状态
- 网络编程遇到的一些问题
- Android:封装Volley网络下载示例
- http://download.csdn.net/download/soft2buy/6515417
- web安全:HTTPS
- HTTP/2协议
- HTTP+XML接口客户端 结合策略模式实现总结
- tcp 网络编程
- TCP/IP协议详解:卷一----笔记(4)UDP
- 从网络中获取图片显示,获取网页源码
- 利用tar 通过网络拷贝数据
- http状态码分类
- Https学习
- http 的八种方法(动作)
- [网络流24题][codevs1906]最长递增子序列(dp+isap)
- TCP/IP 路由 卷一 习题 ospf
- http之头域
- 做网络爬虫过程过程中遇到的问题