Android okHttp网络请求之缓存控制Cache-Control
前言:
前面的学习基本上已经可以完成开发需求了,但是在项目中有时会遇到对请求做个缓存,当没网络的时候优先加载本地缓存,基于这个需求我们来学习一直okHttp的Cache-Control。
okHttp相关文章地址:
- Android okHttp网络请求之Get/Post请求
- Android okHttp网络请求之文件上传下载
- Android okHttp网络请求之Json解析
- Android okHttp网络请求之缓存控制Cache-Control
- Android okHttp网络请求之Retrofit+Okhttp组合
Cache-Control:
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令有下几种:
- Public指示响应可被任何缓存区缓存。
- Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
- no-cache指示请求或响应消息不能缓存
- no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
- max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
- min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
- max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
CacheControl.java类介绍:
1.)常用的函数:如下代码,里面已经加了注释就不一一解释了,每个函数都是对应一个缓存指令设置
final CacheControl.Builder builder = new CacheControl.Builder();builder.noCache();//不使用缓存,全部走网络builder.noStore();//不使用缓存,也不存储缓存builder.onlyIfCached();//只使用缓存builder.noTransform();//禁止转码builder.maxAge(10, TimeUnit.MILLISECONDS);//指示客户机可以接收生存期不大于指定时间的响应。builder.maxStale(10, TimeUnit.SECONDS);//指示客户机可以接收超出超时期间的响应消息builder.minFresh(10, TimeUnit.SECONDS);//指示客户机可以接收响应时间小于当前时间加上指定时间的响应。CacheControl cache = builder.build();//cacheControl
2.)两个CacheControl常量介绍:
CacheControl.FORCE_CACHE; //仅仅使用缓存CacheControl.FORCE_NETWORK;// 仅仅使用网络
举例,我们设置一个有效期为10秒的CacheControl
final CacheControl.Builder builder = new CacheControl.Builder();builder.maxAge(10, TimeUnit.MILLISECONDS);CacheControl cache = builder.build();
3.)请求时如何使用
final CacheControl.Builder builder = new CacheControl.Builder();builder.maxAge(10, TimeUnit.MILLISECONDS);CacheControl cache = builder.build();final Request request = new Request.Builder().cacheControl(cache).url(requestUrl).build();final Call call = mOkHttpClient.newCall(request);// call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {failedCallBack("访问失败", callBack);Log.e(TAG, e.toString());}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String string = response.body().string();Log.e(TAG, "response ----->" + string);successCallBack((T) string, callBack);} else {failedCallBack("服务器错误", callBack);}}});return call;} catch (Exception e) {Log.e(TAG, e.toString());}
以上如果cache没有过去会直接返回cache而不会发起网络请求,若过期会自动发起网络请求。注意:如果您使用FORCE_CACHE和网络的响应需求,OkHttp则会返回一个504提示,告诉你不可满足请求响应。所以我们加一个判断在没有网络的情况下使用
//判断网络是否连接boolean connected = NetworkUtil.isConnected(context);if (!connected) {request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();}
okHtitp知识扩展:
1.)Interceptor拦截器,见名知意就是拦截操作,这里用来拦截Request对其做一些特殊处理,举例:比如上面我们使用到了CacheControl,我们怎么拦截一个请求在网络不可用的时候使用CacheControl.FORCE_CACHE;
OkHttpClient.Builder newBuilder = mOkHttpClient.newBuilder();newBuilder.addInterceptor(new Interceptor() {@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();boolean connected = NetworkUtil.isConnected(context);if (!connected) {request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();}Response response = chain.proceed(request);return response;}});
2.)OkHttp 提供了对用户认证的支持。当 HTTP 响应的状态代码是 401 时,OkHttp 会从设置的 Authenticator 对象中获取到新的 Request 对象并再次尝试发出请求。Authenticator 接口中的 authenticate 方法用来提供进行认证的 Request 对象.
OkHttpClient client = new OkHttpClient();client.newBuilder().authenticator(new Authenticator() {@Overridepublic Request authenticate(Route route, Response response) throws IOException {String credential = Credentials.basic("user", "password");return response.request().newBuilder().header("Authorization", credential).build();}});
小结:okHttp的简单使用到此介绍完毕,至于很多高级使用还有待研究。接下来准备研究下OkHttp与retrofit结合使用。
Android okHttp网络请求之缓存控制Cache-Control相关推荐
- java中使用okhttpsoap,Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
Retrofit介绍: Retrofit和okHttp师出同门,也是Square的开源库,它是一个类型安全的网络请求库,Retrofit简化了网络请求流程,基于OkHtttp做了封装,解耦的更彻底:比 ...
- 详解 Android okhttp 网络请求get,post传输数据的基本用法
官网网址:http://square.github.io/okhttp/ github地址:https://github.com/square/okhttp OKHttp优点 1.支持HTTP2/SP ...
- Android 开发之Okhttp网络请求日志打印
这里写自定义目录标题 Android 开发之Okhttp 网络请求日志打印 OkHTTP网络日志打印 Android 开发之Okhttp 网络请求日志打印 网络请求是开发的日常工作内容之一,网络日志打 ...
- Android中使用logger打印完整的okhttp网络请求和响应的所有相关信息(请求行、请求头、请求体、响应行、响应行、响应头、响应体)
如果你的项目中的网络请求库是Retrofit的话,他的底层封装的是OkHttp,通常调试网络接口时都会将网络请求和响应相关数据通过日志的形式打印出来.OkHttp也提供了一个网络拦截器okhttp-l ...
- 【小王的安卓之路】Android原生网络请求
Android原生网络请求 一. 网络请求的必要性 二. 网络请求分类 三. 网络请求实现方法 四. 注意事项 一.网络请求的必要性: 如今单机APP早已经接近消失就连最简单的时钟日期等软件都需要去请 ...
- Fragment标签页+OKHttp网络请求数据+MVP模式
分包方式 需要的第三方依赖 Fragment 新建两个fragment MainActivity 主页面布局 设置Fragment+tablayout的适配器 Fragment标签页结束 OKHttp ...
- 利用Fiddler对Android手机网络请求进行抓包
在Android的开发调试过程中,特别是针对网络编程的情况,很多时候我们希望能够对Android的网络请求进行抓包,用来定位以及分析我们程序的问题.下面我介绍使用Fiddler对Android模拟器的 ...
- android之网络请求 -- 获取RecyclerView的列表项(图片 + 文字)
android之网络请求 -- 获取RecyclerView的列表项 示意图,网络请求的地址,插件及依赖 代码架构 代码内容 MainActivity.java activity_main.xml R ...
- 『Android』网络请求数据与JSON解析
『Android』网络请求数据与JSON解析
最新文章
- iOS 获取Assets中的启动页
- https refused 解决方法
- ORACLE 11G RAC ASM磁盘全部丢失后的恢复
- java 重置定时器_可重置Java定时器
- 关于明晚即将发布的新款 iPad Pro,最大的亮点也许不是 Face ID
- elt php,ELT(数据仓库技术) 学习
- cad相对坐标快捷键_CAD里面绝对、相对、极坐标是什么?如何区别
- 中间表是什么?和报表有什么关系?会带来怎样的问题?又如何解决?
- linux 下载ftp 命令,在Linux命令行中安装及使用FTP客户端的方法
- 亲测,超实用Zbrush笔刷大合集,腾讯金牌建模师同款
- 会动的博物馆?广州华锐互动3D展示技术实现空间复刻
- ssh服务器配置以及密匙登录
- 微信公众号发红包需要的API证书是什么,如何获取API证书?
- 转:王树国,怎样的校长才是一位好校长?
- Linux攻关之基础模块五 Vim
- DEVC++的几个实用小技巧
- 【Hadoop】谷歌的三篇论文(GFS、MapReduce分布式计算模型 、BigTable大表)
- STM32——中断概览(中断优先级)
- 自动关机 DOS命令
- 2021年化工自动化控制仪表考试试卷及化工自动化控制仪表模拟考试题库
热门文章
- 运维系统分析工具ss,htop,dstat
- “快”和“持久”对弈:非旗舰处理器的破局之路
- [转载] 老版本ubuntu 更新源
- window下用主机名登录MySQL数据库出现报错解决方案
- Exchange Server 2013系列四:小企业邮件系统部署
- 通过修改PHP源代码解决Nginx下WebShell跨站的问题
- SCMagazine: SIEM走出阴影,迈向光明
- c# Open Source
- javascript 滚动+停留 代码
- Windows多屏开发小记