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

 更新时间:2017年03月27日 15:52:18   作者:gengqiquan  
这篇文章主要介绍了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”)就可以把当前数据缓存一天啦

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

相关文章

  • Android AccessibilityService 事件分发原理分析总结

    Android AccessibilityService 事件分发原理分析总结

    这篇文章主要介绍了Android AccessibilityService 事件分发原理分析总结,AccessibilityService有很多用来接收外部调用事件变化的方法,这些方法封装在内部接口Callbacks中,文章围绕AccessibilityService相关资料展开详情,需要的朋友可以参考一下
    2022-06-06
  • Android使用socket创建简单TCP连接的方法

    Android使用socket创建简单TCP连接的方法

    这篇文章主要介绍了Android使用socket创建简单TCP连接的方法,结合实例形式详细分析了Android使用socket创建TCP连接的具体步骤与实现技巧,需要的朋友可以参考下
    2016-04-04
  • Flutter实现笑嘻嘻的动态表情的示例代码

    Flutter实现笑嘻嘻的动态表情的示例代码

    这篇文章主要为大家介绍了如何利用Flutter实现笑嘻嘻的动态表情,文中的示例代码讲解详细,对我们学习Flutter有一定帮助,感兴趣的可以了解一下
    2022-04-04
  • Android 3D滑动菜单完全解析 Android实现推拉门式的立体特效

    Android 3D滑动菜单完全解析 Android实现推拉门式的立体特效

    这篇文章主要为大家详细介绍了Android 3D滑动菜单,Android实现推拉门式的立体特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Android程序结构简单讲解

    Android程序结构简单讲解

    在本篇文章里小编给大家分享一篇关于Android程序结构的简单说明内容,有需要的朋友们跟着学习下。
    2019-02-02
  • Android开启新线程实现电子广告牌项目

    Android开启新线程实现电子广告牌项目

    这篇文章主要为大家详细介绍了Android开启新线程实现电子广告牌项目,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • React-Native  Android 与 IOS App使用一份代码实现方法

    React-Native Android 与 IOS App使用一份代码实现方法

    这篇文章主要介绍了React-Native Android 与 IOS App使用一份代码实现方法的相关资料,这里举例说明,该如何实现IOS和Android APP 都使用一样的代码,需要的朋友可以参考下
    2016-12-12
  • 上传Android项目至github的解析

    上传Android项目至github的解析

    本文主要讲解了如何将自己的android项目上传至github,相信大家平时在开发过程中为了避免重复造轮子会经常逛一下github查看有没有与需求类似的开源项目,那么github上面的开源项目是如何上传至github上的呢?
    2018-05-05
  • Toast类避免显示时间叠加的方法

    Toast类避免显示时间叠加的方法

    这篇文章主要为大家详细介绍了Toast类避免显示时间叠加的方法,线程中可用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • flutter ExpansionTile 层级菜单的实现

    flutter ExpansionTile 层级菜单的实现

    这篇文章主要介绍了flutter ExpansionTile 层级菜单的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论