我们在做网络请求的时候,如果网络请求过于频繁而且请求的数据变动不大,或者基本没有变动,这个时候如果没有缓存功能,我们想一下

会浪费掉多少资源,一次请求刷新一次,去请求一次,不但会消耗用户的流量,而且还对服务端造成不必要的网络压力(当然如果服务器牛逼那么无所谓(*^__^*) )

所以除了自己做缓存以外okhttp自己也有一套缓存的机制

那就是继承Interceptor接口

我们先下okhttp中 Interceptor的介绍

/*** Observes, modifies, and potentially short-circuits requests going out and the corresponding* responses coming back in. Typically interceptors add, remove, or transform headers on the request* or response.*/

他的大概意思就是 观察,修改,并且使相应的请求走出去,通常添加这个拦截器去添加,移除,或者转换这个请求或者返回的的header 头部信息。

所以这个拦截器的作用就是去修改请求或者返回的头部信息。

那么为什么修改头部信息的拦截器就能做到缓存呢?

我们先看一个包含首部的Http Entry

http://google.com/foo
GET
2
Accept-Language: fr-CA
Accept-Charset: UTF-8
HTTP/1.1 200 OK
3
Content-Type: image/png
Content-Length: 100
Cache-Control: max-age=600

可以看到头部信息有一个Cache-Control缓存控制

我们可以通过设置这个对Http请求进行缓存设置

下面直接看这个类吧(非自己编写,但是忘了作者的地址)

public class CacheInterceptor implements Interceptor {private Context mContext;@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();//获取请求//这里就是说判读我们的网络条件,要是有网络的话我么就直接获取网络上面的数据,要是没有网络的话我么就去缓存里面取数据if(Utils.GetConnectType(mContext) == Constant.NetworkStatus.DisConnect){request = request.newBuilder()//这么写就是只从缓存取
            .cacheControl(CacheControl.FORCE_CACHE).build();LogUtils.v("CacheInterceptor\",\"no network\"");}Response orginalResponse = chain.proceed(request);//有网络的条件下if(Utils.GetConnectType(mContext) != Constant.NetworkStatus.DisConnect){String cacheControl = request.cacheControl().toString();return orginalResponse.newBuilder()//这里设置的为0就是说不进行缓存,我们也可以设置缓存时间.header("Cache-Control", "public, max-age=" + 0).removeHeader("Pragma").build();}else{int maxTime = 4*24*60*60;return orginalResponse.newBuilder()//这里的设置的是我们的没有网络的缓存时间,想设置多少就是多少。.header("Cache-Control", "public, only-if-cached, max-stale="+maxTime).removeHeader("Pragma").build();}}public CacheInterceptor(Context context){this.mContext = context;}}

类里面分别对无网络情况,和有网络情况进行了一个区分,无网络情况下我们在缓存中取,有网络条件下直接进行请求并且还可以设置缓存时间

转载于:https://www.cnblogs.com/fengfenghuifei/p/8065087.html

Okhttp 插入缓存拦截器 解析相关推荐

  1. LindAgile~缓存拦截器支持类的虚方法了

    写它的原因 之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存 ...

  2. 添加拦截器解析用户信息

    已登录购物车 接下来,我们完成已登录购物车. 在刚才的未登录购物车编写时,我们已经预留好了编写代码的位置,逻辑也基本一致. 添加登录校验 购物车系统只负责登录状态的购物车处理,因此需要添加登录校验,我 ...

  3. 这次使用一个最舒服的姿势插入HttpClient拦截器技能点

    码甲哥继续在同程艺龙写一点大前端,今天我们来了解一下如何拦截axios请求/响应?这次我们举一反三,用一个最舒适的姿势插入这个技能点. 本文阅读耗时5 minute,行文耗时5 Days. axios ...

  4. Android Retrofit通过OkHttp设置Interceptor拦截器统一打印请求报文及返回报文

    我们先定义一个打印报文的拦截器,继承Interceptor public class LogInterceptor implements Interceptor {private static fin ...

  5. Spring Cloud Open Feign系列【23】OAuth2FeignRequestInterceptor、BasicAuthRequestInterceptor拦截器解析

    有道无术,术尚可求,有术无道,止于术. 资料整理来自网络 文章目录 BasicAuthRequestInterceptor Basic 认证 使用案例 源码 OAuth2FeignRequestInt ...

  6. okhttp缓存拦截器应用

    之前只是听说缓存,今天我自己也尝试了一下 ,运用了单例模式,我其实对这些都不是很熟悉,我就是学到哪记录到哪,如果有不对的地方,希望各位指教. package com.silent.fuxiokhttp ...

  7. 网络请求框架OkHttp4的使用与原理解析01:任务调度与拦截器分析

    OkHttp任务调度流程: 1. OkHttpClient构建过程分析 案例: OkHttpClient client = new OkHttpClient.Builder().addIntercep ...

  8. OkHttp(二)—— 拦截器

    本篇文章我们将介绍 OkHttp 的拦截器,拦截器是 OkHttp 的核心,正是因为 OkHttp 内置的五大拦截器各司其职,才使得使用者可以轻松的发送网络请求并收到响应.这五大拦截器分别是: 重定向 ...

  9. OKHttp五大拦截器

    文章目录 [1]五大拦截器总体概述 一.责任链设计模式 ①定义: ②为什么要使用责任链模式 [2]拦截器的工作流程 一.默认的5大拦截器有哪些? [3]RetryAndFollowUpIntercep ...

最新文章

  1. ajaxsetup无效_Ajax请求session失效该如何解决
  2. word排版案例报告_停工不停学丨项目部开展Word办公软件使用技能培训
  3. 怎么用PHP建立购物网站,如何使用PHP建设一个购物网站
  4. linux下进程监听端口,linux下查看监听端口对应的进程
  5. lombok之@RequiredArgsConstructor注解
  6. 如何实现分布式锁?赶紧收藏备战金三银四!
  7. AcWing提高算法课Level-3 第六章 基础算法
  8. c语言给出太多参数,C语言中不定参数的实现
  9. 客户信息管理系统类毕业论文文献有哪些?
  10. 同时定位与地图创建综述
  11. python中encode函数_python中文处理之encode/decode函数
  12. linux下移植mplayer播放器
  13. 《经济学通识》一、前言
  14. Linux键盘输入读取
  15. tf 2.0 -- Model -- 模型
  16. 辉芒微IO单片机FT60F011A-RB
  17. canvas快速实现视频的一键截图功能
  18. Java 中的三目运算符
  19. 手机中的那些人机交互都是怎么实现的
  20. 汉字区位码\国标码\机内码之间的换算

热门文章

  1. 动词变名词的变化规则_动词过去式变化规则 - 点评英语网
  2. UnityShader RenderTypeQueue 渲染顺序
  3. 受限玻尔兹曼机准备知识——MCMC方法和Gibbs采样
  4. CF2B The least round way(贪心+动规)
  5. CentOS6找回root密码 - 黑猴子
  6. TP3.2设置URL伪静态满足更好的SEO效果
  7. KVM安装、镜像创建(一)
  8. 如何快糙好猛的使用Shiqi.Yu老师的公开人脸检测库(附源码)
  9. Linq 数据库操作(增删改查)
  10. Heka:Go编写,来自Mozilla,高效、灵活的插件式数据挖掘工具(转)