返回顶部
首页 > 资讯 > 移动开发 >Android 中okhttp自定义Interceptor(缓存拦截器)
  • 416
分享到

Android 中okhttp自定义Interceptor(缓存拦截器)

okhttp拦截器缓存Android 2022-06-06 01:06:19 416人浏览 安东尼
摘要

Android 中okhttp自定义Interceptor(缓存拦截器) 前言: 新公司项目是没有缓存的,我的天,坑用户流量不是么。不知道有人就喜欢一个界面没事点来点去的么。怎

Android 中okhttp自定义Interceptor(缓存拦截器)

前言:

新公司项目是没有缓存的,我的天,坑用户流量不是么。不知道有人就喜欢一个界面没事点来点去的么。怎么办?一个字“加”。

由于项目的网络请求被我换成了retrofit。而retrofit的网络请求默认基于okHttp

okhttp的缓存由返回的header 来决定。如果服务器支持缓存的话返回的headers里面会有这一句


”Cache-Control”,“max-age=time”

这里的time是一个单位为秒的时间长度。意思是缓存的时效,比如要设置这个api的缓存时效为一天

返回的header就应该是


”Cache-Control”,“max-age=3600*24”

不巧。公司的服务器不支持缓存的,怎么看出来的?因为我们的返回的headers是包含这些的

但我们又想用缓存,这个时候怎么办呢。,得益于okhttp的Interceptor机制,一切的配置都可以变得那么简单优雅。

我们可以在拦截器里截获headers然后移除默认的Cache-Control

但是我们知道有些API返回的数据适合缓存,而有些是不适合的,比如资讯列表,各种更新频率比较高的,是不可以缓存的,而像资讯详情这种数据是可以缓存的。所以我们不能直接统一写死。需要动态配置。

同样的,我们也在header里面作文章,自定义一个header。注意这个header一定不能被其他地方使用,不然会被覆盖值。这里我们定义的header的key名字为:Cache-Time。我们在拦截器里去取这个header。如果取得了不为空的值,说明这个请求是要支持缓存的,缓存的时间就是Cache-Time对应的值。我们把他添加进去。

自定义缓存Interceptor


public class CacheInterceptor implements Interceptor {
  @Override
  public Response intercept(Chain chain) throws ioException {
    Request request = chain.request();
    Response response = chain.proceed(request);
    String cache = request.header("Cache-Time");
    if (!Util.checkNULL(cache)) {//缓存时间不为空
      Response response1 = response.newBuilder()
          .removeHeader("Pragma")
          .removeHeader("Cache-Control")
          //cache for cache seconds
          .header("Cache-Control", "max-age="+cache)
          .build();
      return response1;
    } else {
      return response;
    }
  }
}

缓存拦截器定义好了,我们还需要配置缓存的路径。这里我们定义一个缓存的内容提供器


public class CacheProvide {
  Context mContext;
  public CacheProvide(Context context) {
    mContext = context;
  }
  public Cache provideCache() {//使用应用缓存文件路径,缓存大小为10MB
    return new Cache(mContext.getCacheDir(), 10240 * 1024);
  }
}

通过上面的代码我们可以看到我们指定了缓存的大小为10MB。这里如果缓存的数据量大于这个值,内部会使用lur规则进行删除。

下面我们开始配置OkHttpClient


 OkHttpClient client = new OkHttpClient.Builder()
          .addNetworkInterceptor(new CacheInterceptor())//缓存拦截器
          .cache(new CacheProvide(mAppliactionContext).provideCache())//缓存空间提供器
          .connectTimeout(8, TimeUnit.SECONDS)
          .readTimeout(5, TimeUnit.SECONDS)
          .writeTimeout(5, TimeUnit.SECONDS)
          .build();

好了,现在我们如果哪里需要缓存数据的话,只要在请求里添加header(“Cache-Time”,“3600*24”)就可以把当前数据缓存一天啦

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


--结束END--

本文标题: Android 中okhttp自定义Interceptor(缓存拦截器)

本文链接: https://lsjlt.com/news/21983.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 中okhttp自定义Interceptor(缓存拦截器)
    Android 中okhttp自定义Interceptor(缓存拦截器) 前言: 新公司项目是没有缓存的,我的天,坑用户流量不是么。不知道有人就喜欢一个界面没事点来点去的么。怎...
    99+
    2022-06-06
    okhttp 拦截器 缓存 Android
  • 怎么自定义redis缓存拦截器
    自定义Redis缓存拦截器的步骤如下:1. 创建一个实现了`HandlerInterceptor`接口的自定义类,并重写其三个方法`...
    99+
    2023-09-11
    redis
  • Android的OkHttp包中的HTTP拦截器Interceptor用法示例
    OkHttp(GitHub:https://github.com/square/okhttp) 的 Interceptor 就如同名称「拦截器」一样,拦截你的 Request ...
    99+
    2022-06-06
    okhttp 示例 Android
  • mybatisPlus自定义拦截器
    mybatisPlus自定义拦截器 一开始数据库的数据是明文存储,后面某些数据需要变成密文保存在数据库,而且密文的字段在很多数据表中都存在。进行select操作时,把密文查询出来并转成明文。 1、使用切面,当接口获取到数据后,遍历...
    99+
    2023-08-18
    sql 数据库 mysql
  • struts2拦截器怎么自定义
    要自定义Struts2拦截器,您需要按照以下步骤进行操作:1. 创建一个实现 `com.opensymphony.xwork2.in...
    99+
    2023-08-26
    struts2
  • Spring中自定义拦截器的使用
    1、创建自定义拦截器类(UserTokenInterceptor)并实现HandlerInterceptor 接口,再重写方法,代码如下: public class UserToke...
    99+
    2024-04-02
  • Spring中自定义拦截器怎么用
    小编给大家分享一下Spring中自定义拦截器怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!创建自定义拦截器类(UserTokenInterceptor)并实...
    99+
    2023-06-29
  • Java SpringMVC实现自定义拦截器
    目录SpringMVC实现自定义拦截器1 拦截器(interceptor)的作用2 拦截器和过滤器区别3.实现过程3.1创建拦截器类实现HandlerInterceptor接口3.2...
    99+
    2024-04-02
  • springboot自定义拦截器的方法
    拦截器应该分属于web框架的组件,每个框架提供的自己的支持,实现方式也就不同。例如Struts和Spring,以下是Spring 的拦截器总结,它是基于动态代理(反射)实现的。 Sp...
    99+
    2024-04-02
  • OKHttp3(支持Retrofit)的网络数据缓存Interceptor拦截器的实现
    前言:前段时间在开发APP的时候,经常出现由于用户设备环境的原因,拿不到从网络端获取的数据,所以在APP端展现的结果总是一个空白的框,这种情况对于用户体验来讲是极其糟糕的,所以,苦思冥想决定对OKHTTP下手(因为我在项目中使用的网络请求框...
    99+
    2023-05-30
    okhttp interceptor ce
  • Mybatis拦截器实现自定义需求
    目录前言一、应用场景二、Mybatis实现自定义拦截器2.1、编写拦截器2.2、添加到Mybatis配置2.3、测试2.4、小结三、拦截器接口介绍intercept 方法plugin...
    99+
    2023-05-19
    Mybatis自定义拦截器 Mybatis 拦截器
  • 拦截器在Spring MVC中怎么实现自定义
    拦截器在Spring MVC中怎么实现自定义?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. 引言拦截器(Interceptor)实现对每一个请求处理前后进行...
    99+
    2023-05-31
    spring mvc
  • MyBatis中怎么实现自定义的SQL拦截器
    在 MyBatis 中实现自定义的 SQL 拦截器,通常可以通过实现 org.apache.ibatis.plugin.Interc...
    99+
    2024-05-08
    MyBatis SQL
  • Springboot如何实现自定义mybatis拦截器
    这篇文章将为大家详细讲解有关Springboot如何实现自定义mybatis拦截器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实践的准备 : 整合mybatis ,然后故意写了3个查询方法, ...
    99+
    2023-06-22
  • Java SpringMVC如何实现自定义拦截器
    本篇内容主要讲解“Java SpringMVC如何实现自定义拦截器”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java SpringMVC如何实现自定义拦截器”吧!Spri...
    99+
    2023-06-29
  • MyBatis自定义SQL拦截器示例详解
    目录前言定义是否开启注解注册SQL 拦截器处理逻辑如何使用总结前言 本文主要是讲通过 MyBaits 的 Interceptor 的拓展点进行对 MyBatis 执行 SQL 之前做...
    99+
    2024-04-02
  • SpringMVC超详细介绍自定义拦截器
    目录1.什么是拦截器2.自定义拦截器执行流程图3.自定义拦截器应用实例1.快速入门2.注意事项和细节3.Debug执行流程4.多个拦截器1.多个拦截器执行流程示意图2.应用实例3.主...
    99+
    2024-04-02
  • Springboot自定义mybatis拦截器实现扩展
    前言 相信大家对拦截器并不陌生,对mybatis也不陌生。 有用过pagehelper的,那么对mybatis拦截器也不陌生了,按照使用的规则触发sql拦截,帮我们自动添加分页参数 ...
    99+
    2024-04-02
  • struts2自定义拦截器的示例代码
    题目:使用struts2自定义拦截器,完成用户登陆才能访问权限的实现 在session中存放user变量表示用户登陆,若user为空则用户没有登陆,反之登陆 显示提示信息(请先登录)定义拦截器在struts.xml中定义拦截器使用标签&...
    99+
    2023-05-31
    struts2 拦截器 st
  • 链自定义 GRPC 客户端拦截器/DialOptions
    在进行网络通信时,自定义GRPC客户端拦截器和DialOptions是非常有用的工具。这些工具可以帮助开发者在GRPC客户端中添加额外的功能和处理逻辑,以满足特定的需求。php小编香蕉...
    99+
    2024-02-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作