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() {@Overridepublic 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);}@NonNullprivate Cache getCache() {//设置缓存路径File httpCacheDirectory = new File(this.getCacheDir(), "responses");//设置缓存 10Mreturn 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

Android OkHttp之 offline cache相关推荐

  1. Android okHttp网络请求之缓存控制Cache-Control

    前言: 前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control. okHttp ...

  2. Android OkHttp 源码解析 - 拦截器

    一.前言 看一下 RealCall 中的拦截器排序: Response getResponseWithInterceptorChain() throws IOException {// Build a ...

  3. Android OKHttp 可能你从来没用过的拦截器 【实用推荐】

    前言 在平时开发中,你有没有下面这样的困扰呢? 场景一 明明是服务端的接口数据错误,而QA(测试)第一个找到的可能是客户端开发的你,为什么这个页面出现错误了? 而作为客户端开发的你,可能要拿出测试机连 ...

  4. Android OKHttp 拦截器

    前言 在平时开发中,你有没有下面这样的困扰呢? 场景一 明明是服务端的接口数据错误,而QA(测试)第一个找到的可能是客户端开发的你,为什么这个页面出现错误了? 而作为客户端开发的你,可能要拿出测试机连 ...

  5. Android OkHttp 全面详解

    Android OkHttp 全面详解 包的导入 基本使用 异步请求 同步请求 build创建 源码跟踪 newCall RealCall.enqueue Dispatcher.enqueue exe ...

  6. Android OkHttp(1)

     Android OkHttp(1) OkHttp是一个流行的第三方开源网络请求框架,在目前的一些APP开发中比较流行.Android平台开源的网络请求框架不少,比如常见的Volley, Asyn ...

  7. Android okHttp上传图片

    今天,简单讲讲Android 使用OK HTTP上传图片. 不废话了,直接上代码: /*** 上传图片* @param url* @param imagePath 图片路径* @return 新图片的 ...

  8. android okhttp使用cookie请求

    今天,简单讲讲Android的http使用cookie请求. 现在,做一个功能,出现一个奇怪现象,就是老是登陆成功后,发送请求获取消息,老是提示我没有登陆.我自己都不知道是什么原因,这个也是我对网络通 ...

  9. android OKHttp的基本使用详解

    今天,简单讲讲Android里如何使用OKHttp. Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 三.android OKHttp ...

最新文章

  1. 语言编奇数和合偶数和_不同的语言怎样求解奇数和?
  2. 用 vue + d3 画一棵树
  3. master中的系统目录与用户数据库中的区别
  4. jsp mysql 换行_jsp 操作 mysql 数据库
  5. 中国药妆行业投资现状与发展策略分析报告2022-2028年
  6. 7.12固定信息认证
  7. IOS开发学习笔记011-xcode使用技巧
  8. 技术分享连载(二十七)
  9. ROS笔记——Create a cropped bagfile(创建一个已裁剪的包文件)
  10. mysql觸發器_mysql觸發器
  11. JS模块化规范对比以及在Node.js的实现
  12. 工作日志(一)、jquery上传插件uploadify的使用
  13. 阿里云移动端播放器高级功能---画面控制
  14. .Net程序猿玩转Android开发---(11)页面跳转
  15. Kaggle学习笔记--XGBoost
  16. 移动边缘计算——计算卸载
  17. Excel如何将数据填充完下方的空白单元格
  18. 异步FIFO中格雷码和二进制数据的转换
  19. 明尼苏达双城计算机科学硕士申请截止日期,明尼苏达大学双城分校计算机科学理学硕士研究生申请要求及申请材料要求清单...
  20. 【图片上传与图片显示】 SpringBoot ajax (跨域问题)

热门文章

  1. docker配置国内镜像源
  2. 巧用Eclipse Java编辑器调试
  3. 利用WSS搭建学生作业平台
  4. 《Linux From Scratch》第三部分:构建LFS系统 第八章:让LFS系统可引导 - 8.2. 创建 /etc/fstab 文件...
  5. MySql层级树查询
  6. 集群四 mysql-5.7.16一键安装
  7. VS2015使用scanf报错解决方案
  8. 设计模式学习每天一个——Factory模式 和 Abstract Factory模式
  9. 如何在自己的信息管理系统里集成第三方权限控制组件 - 设计一个漂亮的WEB界面...
  10. 我的2009:心智成长篇