您的位置:首页 > 理论基础 > 计算机网络

Android OkHttp之 offline cache

2016-03-07 21:10 429 查看
OkHttp的执行函数execute() 拦截器部分的执行时序图,(假如默认我们给httpClient设置了2个拦截器)



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: