欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-11-19 21:33:40
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是包含这些的

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

但我们又想用缓存,这个时候怎么办呢。,得益于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”)就可以把当前数据缓存一天啦

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