看到很多小伙伴对OkHttp的缓存问题并不是十分了解,于是打算来说说这个问题。用好OkHttp中提供的缓存,可以帮助我们更好的使用Retrofit、Picasso等配合OkHttp使用的框架。OK,废话不多说,我们来看看OkHttp中的缓存。

OkHttp中的缓存整体上来说我们要在两个地方配置,一个是构造OkHttpClient时,还有一个是在构造Request时,一共就这两处,那我们分别来看看。

本文主要包含如下两方面:

1.在OkHttpClient构造时设置缓存路径

2.构造Request时配置缓存策略

OK,那就一步一步来看吧。

1.在OkHttpClient构造时设置缓存路径

我们在使用OkHttp的时候,一般都会将client的获取封装起来,因为在大多数情况下,我们需要的OkHttpClient其实都是一样的。在封装的过程中,我们可以设置很多属性,比如链接超时时间、读取超时时间等,其中也包括我们即将要说的cache,我们可以在这里来配置cache路径,配置了cache路径之后,OkHttp请求到的数据就会缓存到该路径下,当手机没有联网的时候,就可以直接从缓存中加载数据。我们来看看代码:

OkHttpClient client = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).cache(new Cache(new File(this.getExternalCacheDir(), "okhttpcache"), 10 * 1024 * 1024)).build();

我这里是设置了缓存的路径为 ~/mnt/sdcard/Android/data/应用包名/cache/okhttpcache,第二个参数表示缓存区的大小为10M,当缓存区的数据大小超过10M的时候会自动删除已缓存的数据,当我们配置了缓存路径之后,当我发起一个网络 请求之后,如下:

        Request request = new Request.Builder().url("http://www.tngou.net/api/food/list?id=1").build();client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {sb = new StringBuffer();try {JSONObject jo = new JSONObject(response.body().string());JSONArray tngou = jo.optJSONArray("tngou");for (int i = 0; i < tngou.length(); i++) {sb.append(tngou.optJSONObject(i).optString("name")).append("\n");}runOnUiThread(new Runnable() {@Overridepublic void run() {tv.setText(sb.toString());}});} catch (JSONException e) {e.printStackTrace();}}}});

请求完毕之后,用一个TextView将请求结果显示出来,当请求完毕之后,在我们上面所说的那个目录下,可以看到如下三个文件:

这里有三个文件,其中以.0结尾的文件缓存了http的响应头信息,以.1结尾的文件则缓存了我们下载的json数据,journal则是一个日志文件,我们把这几个文件打开来看看:

.0

.1

journal

OK,配置了cache之后,当我们请求过一次数据之后,然后关闭掉网络,这个时候再去请求网络数据,这个时候OkHttp会自动从本地缓存中重新加载数据。

2.构造Request时配置缓存策略

上面的配置应该已经可以满足许多小伙伴的需求了,可是很多时候我们还有许多其他的需求,那么这些需求我们可以在构造Request的时候通过CacheControl来进行进一步的配置。

在构造Request的时候,我们可以配置CacheControl,配置有两种方式,一种是构造CacheControl,还有一种是直接使用CacheControl中的常量,我们来分别看一下:

2.1构造CacheControl

        CacheControl cc = new CacheControl.Builder()//不使用缓存,但是会保存缓存数据//.noCache()//不使用缓存,同时也不保存缓存数据// .noStore()//只使用缓存,(如果我们要加载的数据本身就是本地数据时,可以使用这个,不过目前尚未发现使用场景)//.onlyIfCached()//手机可以接收响应时间小于当前时间加上10s的响应
//                .minFresh(10,TimeUnit.SECONDS)//手机可以接收有效期不大于10s的响应
//                .maxAge(10,TimeUnit.SECONDS)//手机可以接收超出5s的响应.maxStale(5,TimeUnit.SECONDS).build();Request request = new Request.Builder().cacheControl(cc).url("http://192.168.152.2:8080/cache").build();

这个用起来还是比较简单的,没什么好说的,重要代码看注释。

2.2使用CacheControl中的常量

如果直接使用CacheControl中的常量,则不用调用上面那么多的方法,使用方式如下:

        Request request = new Request.Builder()//强制使用网络
//                .cacheControl(CacheControl.FORCE_NETWORK)//强制使用缓存.cacheControl(CacheControl.FORCE_CACHE).url("http://192.168.152.2:8080/cache").build();

OK,这个就是我们OkHttp中缓存的一个基本使用,有问题欢迎留言讨论。

以上。

一网打尽OkHttp中的缓存问题相关推荐

  1. okhttp配置缓存策略_一网打尽OkHttp中的缓存问题

    看到很多小伙伴对OkHttp的缓存问题并不是十分了解,于是打算来说说这个问题.用好OkHttp中提供的缓存,可以帮助我们更好的使用Retrofit.Picasso等配合OkHttp使用的框架.OK,废 ...

  2. Spring中使用缓存时你应该知道的知识

    2019独角兽企业重金招聘Python工程师标准>>> 常见问题 缓存穿透,雪崩,击穿 下面的文章里都有详细介绍 http://blog.csdn.net/zeb_perfect/a ...

  3. 大型分布式系统中的缓存架构

    作者:陈彩华 来自:51cto技术栈(ID:blog51cto) 本文主要介绍大型分布式系统中缓存的相关理论,常见的缓存组件以及应用场景. 缓存概述 缓存概述 缓存的分类 缓存主要分为四类,如下图: ...

  4. HTTP请求中的缓存(cache)机制

    当资源第一次被访问的时候,HTTP头部如下 (Request-Line) GET /a.html HTTP/1.1 Host    127.0.0.1 User-Agent  Mozilla/5.0 ...

  5. Web应用中的缓存一致性问题

    2019独角兽企业重金招聘Python工程师标准>>> 上篇总结了缓存中出现频率比较高的一些问题,今天详细说说web应用中的缓存一致性问题. 主要说以下三个方面 数据库与缓存中数据不 ...

  6. Asp.Net中MVC缓存详解

    本文通过介绍了Asp.Net中MVC缓存的种类,以及他们之间的区别等内容,让学习者能够深入的了解MVC缓存的原理机制,以下是具体内容: 缓存是一种保存资源副本并在下次请求时直接使用该副本的技术.当 w ...

  7. django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决

    django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决 参考文章: (1)django中的缓存 单页面缓存,局部缓存,全站缓存 跨域问题的解决 (2)https://www.cnblog ...

  8. web开发中的缓存问题的研究(一)

    web开发中的缓存问题的研究(一) web开发中的缓存问题的研究(二) web开发中的缓存问题的研究(三) 一般情况下,浏览器都会缓存已经访问过的页面内容,关于如何禁止浏览器缓存的介绍,在网上到处都有 ...

  9. Mybatis中的缓存

    Mybatis中的缓存 什么是缓存 存在于内存中的临时数据. 为什么使用缓存 减少和数据库的交互次数,提高执行效率. 什么样的数据能使用缓存,什么样的数据不能使用 适用于缓存: 经常查询并且不经常改变 ...

最新文章

  1. 【Codeforces】716B Complete the Word (26个字母)
  2. .net通过一般处理程序模拟用户控件数据保持、Ispostback 【第二版将html与ashx文件分开】...
  3. “package XXX is not in GOROOT“ when building a Go project2021-09-06
  4. 中国基础软件历史性突破!Gartner最新报告:阿里云进入全球数据库领导者象限
  5. 矢量合成和分解的法则_专题14 运动的合成与分解
  6. UI设计灵感|3D\C4D元素网站,流行最前沿
  7. Java线程:线程私有变量
  8. java 如何添加背景音乐_Java程序怎样添加背景音乐?
  9. 计算机学习路线推荐(初稿)
  10. 计算机硬件主板各部分内部结构,电脑主板各个模块介绍与原理解读
  11. C语言编程学习的经验
  12. 【新知实验室 基于WEB的实时音视频(TRTC)案例搭建】
  13. shader篇-漫反射
  14. MySQL数据库比较工具 - mysqldbcompare
  15. 5. Django templates模板 (一)
  16. 生产者消费者1.0(wait notify)
  17. 【电子电路】上拉电阻与下拉电阻的作用
  18. lol更新后连接不上服务器未响应,LOL登录错误服务器未响应 更新后无法进入游戏解决方法推荐...
  19. 技术面试 - Java SE
  20. python批量修改图片分辨率完整程序

热门文章

  1. 阿里云服务器qq邮箱无法推送问题
  2. SSM配置地狱?一篇整合模板迅速解决!【建议收藏】
  3. 扛住100亿次请求——如何做一个“有把握”的春晚红包系统?
  4. 云服务器和共享主机,共享虚拟主机、独享虚拟主机还是云服务器?
  5. xml使用非常简单,只需要如下
  6. java开发平板_用Android平板来写代码 - Termux 环境搭建
  7. SCTF2018 Writeup
  8. Google Earth Engine ——重采样过程中的错误
  9. ecshop 服务器操作系统,ecshop 云服务器
  10. 【2016NOIP普及组】T1:买铅笔 试题解析