okhttp配置缓存策略_一网打尽OkHttp中的缓存问题
看到很多小伙伴对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() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public 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() {
@Override
public 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配置缓存策略_一网打尽OkHttp中的缓存问题相关推荐
- 网卡清空缓存命令_清除网卡中IP缓存
如果你是一位网络管理员,遇到各式各样的网络故障是常有的事情:可是有的网络故障,无论怎么排除,就是无法消除.在万不得已的情况下,相信你肯定会删除网卡,然后重新安装网卡,以便让网卡恢复到"原始& ...
- okhttp配置缓存策略_网站的缓存控制策略最佳实践及注意事项
对于一个网站来讲,性能关乎用户体验,你在更短的时间内打开网站,你将会留住更多的用户.如果你的页面十秒才能打开,那再好的用户交互也是徒然. 缓存控制是网站性能优化中至为常见及重要的一环,好的缓存控制,除 ...
- picACG本地缓存目录_前端工程师必备之缓存问题
缓存是个老生长谈的问题,对于前端工程师来讲更是我们的必修课.或许很多人会说我的项目并没有问题,根本不需要聊什么缓存.如果真的是这样,只能证明你前端道路才刚刚开始. 背景 小郭今天分享缓存的原因在于:公 ...
- 浏览器总是跳转到缓存界面_跳转到企业缓存之前要考虑的事项
浏览器总是跳转到缓存界面 介绍 关系数据库事务是ACID ,强大的一致性模型简化了应用程序开发. 由于启用Hibernate缓存是一项配置 ,因此,只要数据访问层开始出现性能问题,就转向缓存非常吸引人 ...
- php mysql缓存技术_系统的讲解 - PHP 缓存技术
概述 缓存已经成了项目中是必不可少的一部分,它是提高性能最好的方式,例如减少网络I/O.减少磁盘I/O 等,使项目加载速度变的更快. 缓存可以是CPU缓存.内存缓存.硬盘缓存,不同的缓存查询速度也不一 ...
- 微信朋友圈服务器缓存策略,微信小游戏 RES版本控制+缓存策略
参考: 一.我们的目标 目标就是让玩家快速进入游戏,然后根据游戏的进度加载相应的资源,并可对资源进行版本控制.本地缓存.热更新. 如果美术改一张图或者策划修改一个配置文件就要发布版本再审核,就比较麻烦 ...
- java中一级缓存_JavaWeb_(Hibernate框架)Hibernate中一级缓存
Hibernate中一级缓存 Hibernate 中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份.其中一级缓存是 Hibernate 的内置缓存,在前面 ...
- flutter重新配置sdk路径_在Android中配置flutter
此文章主要是解决AS配置flutter时出现的一些问题,如果要安装flutter,可以先参考flutter的官方安装步骤, Flutter 社区中文资源flutter.cn 如果安装出现问题,可以参 ...
- php怎么启用浏览器缓存,如何停用浏览器中的缓存? - php
例如,如果退出Yahoo邮件,然后单击"后退"按钮,它将不会加载最后一页,而是会将您重定向到登录页面. 我必须使用PHP代码来执行此操作,而我正在使用CodeIgniter. 一些 ...
最新文章
- 企业 - php nginx memcache
- mysql每组随机一条_MySql分组后随机获取每组一条数据的操作
- 数据库连接字符串.udl
- rto初始化和计算_TCP系列15—重传—5、Linux中RTO的计算
- 危险,几条可致命的Linux命令!
- selenium常用定位方式
- SecureCRT连接阿里云ECS服务器,经常掉线的解决方案
- VC2013 配置属性
- 指付通盗刷信用卡维权连载--9月5日给上海银监局的一封信
- latex 中下括号 underbrace 如何对齐
- 基于Ubuntu20.04运行OP-TEE_3.17.0_QEMU_V8的环境搭建
- 在php中利用gd2库的函数创建水印
- word里输入向上或向下取整符号
- 服务器异常卡顿 无法重装系统,电脑重装系统经常卡死怎么解决
- 管理科学:忽悠法求最大最小值
- Mopria为Windows 10更新提供IPP打印解决方案
- 51单片机用定时器0实现流水灯
- RTP协议基本分析(RTSP、WebRTC使用)
- 酷开系统坚持精细化运营,引领行业变革
- C语言 : 文件的操作
热门文章
- java比c,Java比C ++更好
- Hadoop——Yarn(4)
- 大数据分析软件具备哪些功能特点
- 采购物联网卡如何选择流量套餐
- sql文字转换全拼_Mysql中文汉字转拼音的实现(每个汉字转换全拼)
- Jenkins 流水线 获取git 分支列表_持续集成工具Jenkins看这篇就够啦!
- python报表自动化系列 - 通过Python使用MySQL数据库
- csv 20位数据 如何打开可以预览完整数字_条码打印软件如何批量制作MSI Plessey码...
- like mybatis 用法_Mybaits中Like 的使用方式以及一些注意点
- 组件加name属性_从零开始学习React-属性绑定(三)