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”)就可以把当前数据缓存一天啦

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

(0)

相关推荐

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

    Android 中okhttp自定义Interceptor(缓存拦截器) 前言: 新公司项目是没有缓存的,我的天,坑用户流量不是么.不知道有人就喜欢一个界面没事点来点去的么.怎么办?一个字"加". 由于项目的网络请求被我换成了retrofit.而retrofit的网络请求默认基于okhttp okhttp的缓存由返回的header 来决定.如果服务器支持缓存的话返回的headers里面会有这一句 "Cache-Control","max-age=time&

  • Android 封装Okhttp+Retrofit+RxJava,外加拦截器实例

    1.创建一个接口,用来定义接口使用的 public interface Api { @POST("product/getProductDetail") Observable<Goods_Bean> getGoods(@QueryMap Map<String,String> map); @POST("product/addCart") Observable<Add_Bean> getAdd(@QueryMap Map<Stri

  • Java自定义过滤器和拦截器实现ThreadLocal线程封闭

    目录 线程封闭 ThreadLocal线程封闭实现步骤 封装ThredLocal的方法 自定义过滤器 自定义拦截器 Application类启动类中配置自定义过滤器和拦截器 定义调用接口 请求访问验证 线程封闭 线程封闭一般通过以下三个方法: Ad-hoc线程封闭:程序控制实现,最糟糕,忽略 堆栈封闭:局部变量,无并发问题 ThreadLocal线程封闭:特别好的封闭方法 方法2是最常用的,变量定义在接口内,本文主要讲解方法三,SpringBoot项目通过自定义过滤器和拦截器实现ThreadLo

  • 详解SpringBoot中自定义和配置拦截器的方法

    目录 1.SpringBoot版本 2.什么是拦截器 3.工作原理 4.拦截器的工作流程 4.1正常流程 4.2中断流程 5.应用场景 6.如何自定义一个拦截器 7.如何使其在Spring Boot中生效 8.实际使用 8.1场景模拟 8.2思路 8.3实现过程 8.4效果体验 9.总结 1.SpringBoot版本 本文基于的Spring Boot的版本是2.6.7 . 2.什么是拦截器 Spring MVC中的拦截器(Interceptor)类似于ServLet中的过滤器(Filter),它

  • Springmvc中的转发重定向和拦截器的示例

    本文介绍了Springmvc中的转发重定向和拦截器的示例,分享给大家,具体如下: 可变参数在设计方法时,使用 数据类型... 来声明参数类型,例如: public static void function(int... numbers) 在实现方法体时,可变参数是作为数组来处理 public class Test{ public static void main(String[] args){ System.out.println(Test.sum(1,2,3)); System.out.pri

  • 关于Spring Cache 缓存拦截器( CacheInterceptor)

    目录 Spring Cache 缓存拦截器( CacheInterceptor) spring cache常用的三种缓存操作 具体整个流程是这样的 CacheInterceptor.java 定义Cacheable注解 定义Rediskey.java Cache.java RedisCache.java CacheManager.java AbstractCacheManager.java RedisCacheManager.java 实现CacheInterceptor.java 配置Spri

  • 详解Android中图片的三级缓存及实例

    详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

  • spring自定义注解实现拦截器的实现方法

    类似用户权限的需求,有些操作需要登录,有些操作不需要,可以使用过滤器filter,但在此使用过滤器比较死板,如果用的话,就必须在配置文件里加上所有方法,而且 不好使用通配符.这里可以采用一种比较简单灵活的方式,是采用spring 的 methodInterceptor拦截器完成的,并且是基于注解的.大概是用法是这样的: @LoginRequired @RequestMapping(value = "/comment") public void comment(HttpServletRe

  • Android中图片的三级缓存机制

    我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了图片的缓存这一操作机制. 原理: 首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存缓存中,缓存到强引用中 也就是LruCache中.如果强引用中空间不足,就会将较早存储的图片对象驱逐到软引用(softReference)中存储,然后将图片缓存到文件(内部存储外部存储)中:读取图片的时候,先读取内存缓存,判断强引用中是否存在图片,如果强引用中存在,则直接读取,如果强引用中不存在,则

  • Asp.net Core 3.1基于AspectCore实现AOP实现事务、缓存拦截器功能

    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理.给一个方法加一个缓存特性,那这个方法就会进行缓存. 这个也是网上说的面向切面编程AOP. AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存.日志等处理. 在net core2.2时,我当时就尝试过用autofac实现aop,但这次我不想用autofac,我用了一个更轻量级的框架,AspectCore. 用起来非常非常的简单,但一

随机推荐