Okhttp是由Sqare公司开发的开源网络访问库,目前在Android和Java开发中有着广泛的应用。在Android开发中和Retrofit结合可以非常方便地调用网络接口。

使用缓存可以让我们的app不用长时间地显示令人厌烦的加载圈,提高了用户体验,而且还节省了流量,在数据更新不是很频繁的地方使用缓存就非常有必要了。想要加入缓存不需要我们自己来实现,Okhttp已经内置了缓存,默认是不使用的,如果想使用缓存我们需要手动设置。

服务器支持缓存

如果服务器支持缓存,请求返回的Response会带有这样的Header:Cache-Control, max-age=xxx,这种情况下我们只需要手动给okhttp设置缓存就可以让okhttp自动帮你缓存了。这里的max-age的值代表了缓存在你本地存放的时间,可以根据实际需要来设置其大小。

首先我们要提供了一个文件路径用来存放缓存,出于安全性的考虑,在Android中我们推荐使用Context.getCacheDir()来作为缓存的存放路径,另外还需要指定缓存的大小就可以创建一个缓存了。如下所示:

1
2
3
public Cache provideCache() {        return new Cache(mContext.getCacheDir(), 10240*1024);
    }

创建了这个缓存后我们还需要将其设置到okttpClient对象里面:

1
2
3
4
5
6
OkHttpClient okHttpClient = new OkHttpClient();
OkHttpClient newClient = okHttpClient.newBuilder()
               .cache(cache)
               .connectTimeout(20, TimeUnit.SECONDS)
               .readTimeout(20, TimeUnit.SECONDS)
               .build();

服务器不支持缓存

如果服务器不支持缓存就可能没有指定这个头部,或者指定的值是如no-store等,但是我们还想在本地使用缓存的话要怎么办呢?这种情况下我们就需要使用Interceptor来重写Respose的头部信息,从而让okhttp支持缓存。
如下所示,我们重写的Response的Cache-Control字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class CacheInterceptor implements Interceptor {    @Override
    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();
        Response response = chain.proceed(request);
        Response response1 = response.newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                //cache for 30 days
                .header("Cache-Control", "max-age=" + 3600 * 24 * 30)
                .build();
        return response1;
    }
}

然后将该Intercepter作为一个NetworkInterceptor加入到okhttpClient中:

1
2
3
4
5
6
7
8
 OkHttpClient okHttpClient = new OkHttpClient();

OkHttpClient newClient = okHttpClient.newBuilder()
        .addNetworkInterceptor(new CacheInterceptor())
        .cache(cache)
        .connectTimeout(20, TimeUnit.SECONDS)
        .readTimeout(20, TimeUnit.SECONDS)
        .build();

这样我们就可以在服务器不支持缓存的情况下使用缓存了。

完整代码见github:

A simple Android app shows Hearthstone cards with okhttp, retrofit, dagger2 and Meterail Design

地址:https://github.com/Chaoba/HearthstoneCards

Okhttp----缓存的加入方式----附完整demo相关推荐

  1. Android 拖动条(SeekBar)实例 附完整demo项目代码

    Android 拖动条(SeekBar)实例 附完整demo项目代码 1.拖动条的事件 实现SeekBar.OnSeekBarChangeListener接口.需要监听三个事件: 数值改变(onPro ...

  2. java ajax实现分页代码,jQuery实现分页功能(含ajax请求、后台数据、附完整demo)...

    需求分析 1)需要首页,末页功能 2)有点击查看上一页,下一页功能 3)页码到当前可视页码最后一页刷新页面 实现思路 也是分为三部分处理 1)点击首页,末页直接显示第一页或者最后一页内容,当前页面为第 ...

  3. 【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

    目录 目录 前言 一.相关概念介绍 二.实战开发 三.项目演示 四.Demo案例源码地址 五.更新记录 1.2020/12/29 :修改 setupService()中错误 2.2021/05/14 ...

  4. Flask实现登录功能【附完整Demo】

    网站少不了要和数据库打交道,归根到底都是一些增删改查操作,这里做一个简单的用户登录功能来学习一下Flask如何操作MySQL. 用到的一些知识点:Flask-SQLAlchemy.Flask-Logi ...

  5. Windows PC和安卓Socket通信,附完整Demo。

    前言:由于要实现将安卓相机的预览数据在PC上处理,所以想到的就是通过socket方式进行通信,PC端采用c#实现.实际测试发现要想高速传输还是有难度,即使用千兆网,目前效果还是不理想.每帧1.5MB的 ...

  6. Android三级图片缓存框架思路【附练习Demo】

    缓存的简介 现在android应用中不可避免的要使用图片,有些图片是可以变化的,需要每次启动时从网络拉取,这种场景在有广告位的应用以及纯图片应用(比如百度美拍)中比较多.
        现在有一个问 ...

  7. Python+Twisted+Autobahn实现Websocket(附完整demo)

    在游戏行业游戏客户端和服务端需要大量的,快速的通讯,这里面就会用到websocket . Autobahn 是一个高性能的websocket 它采用了两种实现方案 . 1 基于Twisted 2 基于 ...

  8. android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...

    本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...

  9. Axure导入元件库的两种方式-附完整元件库

    Axure导入原件库有两个方式: 一.通过工具导入 在Axure面板中的库点击如下所示的图标,然后选择载入元件库 二.复制元件库到软件安装目录下的DefaultSettings\Libraries下 ...

最新文章

  1. 使用 OpenCV 和 Tesseract 对图像中的感兴趣区域 (ROI) 进行 OCR
  2. 贝壳一站式大数据开发平台实践
  3. 神策数据入选“2021CCFA 零售行业技术新锐企业榜单”
  4. linux管理Windows文件,Linux与Windows互传文件,用户组管理和用户管理
  5. glup打包代码不更新
  6. Java常见bean mapper的性能及原理分析
  7. idea 调试远程tomcat
  8. SpringCloud Config详解
  9. Class.forName()方法抛出异常
  10. 安装CentOS7虚拟机
  11. 关于字符 字节 python3
  12. C语言制作小游戏——贪吃蛇
  13. 记事本编码html乱码,记事本乱码怎么办【解决方法】
  14. 01-2制作U盘启动盘--装机助理工具
  15. MySQL数据库主从双向同步
  16. MAC和IP地址伪造发包
  17. win7计算机excel快捷键,excel快捷键大全 公式
  18. Leetcode 1324. Print Words Vertically
  19. 玩安卓从 0 到 1 之列表一键置顶
  20. 用户可以通过软件对计算机,用户可以通过 软件对计算机软、硬件资源进行管理。...

热门文章

  1. python爬取小说章节信息用pygame进行数据显示_爬虫不过如此(python的Re 、Requests、BeautifulSoup 详细篇)...
  2. 使用了未经检查或不安全的操作_上溪镇开展压痕机使用企业安全生产专项检查...
  3. 微型计算机中的外存储器 现在普遍采用,2010澳门特别行政区全国计算机等级考试二级笔试试卷VB最新考试试题库(完整版)...
  4. 新手学电脑入门教程_炒股技巧大全丨炒股新手怎样才能长期稳定盈利
  5. C++知识点48——类继承与类的作用域
  6. 学生计算机教室管理规章制度,学校规章制度之小学信息技术教室管理制度
  7. 11年瑞纳手动挡值多少钱_三分钟让你知道手中的松石值多少钱
  8. gcc编译c文件_Linux下C语言程序的编译过程
  9. hive创建mysql表,hiveMysql创建、修改、删除字段/表
  10. mysql 新增更新_MySQL新增数据,存在就更新,不存在就添加(转帖加实测)