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
- Android OkHttp之 offline cache
- Android okHttp网络请求之缓存控制Cache-Control
- Android okHttp网络请求之缓存控制Cache-Control
- Android okHttp 实战(四):okHttp网络请求之缓存控制Cache-Control
- android之okhttp
- okhttp,Android网络框架学习之OKHttp
- Android Okhttp缓存:Cache,创建OkHttpClient实现(一)
- Android之OKHttp使用总结
- Android Okhttp之Okio解析
- 揭秘Android 6.0 之 OkHttp
- Android网络技术之OkHttp框架
- Android之okhttp的用法
- android 之OkHttp封装模板
- Android之Okhttp初级使用
- android真机调式问题之offline target
- android真机测试之offline或unauthorized错误
- Android okHttp网络请求之Retrofit+Okhttp组合(五)
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- 验证码图像识别-python
- 算法训练 学做菜
- 双重检查加锁机制--解决线程安全
- 【数据结构】堆
- POJ 3903 —— Stock Exchange 最长上升子序列
- Android OkHttp之 offline cache
- G代码 机器人的CNC实现
- C++标准库简介、与STL的关系。
- 亲测实验,RTC使用内部低速时钟LSI时,对RTC的配置过程
- 51Nod 1085 背包问题(01背包 )
- ElasticSearch学习_陶文3_时间序列数据库的秘密(3)——加载和分布式计算
- 二维数组名本质
- MongoDB利用正则表达式查询(pymongo实现)
- Java之泛型基础