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

  

<强> Android中okhttp自定义拦截器(缓存拦截器)

  

<强>前言:

  

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

  

由于项目的网络请求被我换成了改造。而改造的网络请求默认基于okhttp
  

  

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

        “cache - control”、“信息=时间”   之前      

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

  

返回的头就应该是

        “cache - control”、“信息=3600 * 24”   之前      

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

  

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

  

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

  

我们可以在拦截器里截获头然后移除默认的cache - control

  

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

  

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

  

<>强自定义缓存拦截

        公共类CacheInterceptor实现拦截器{   @Override   公开回应拦截(链链)抛出IOException {   请求请求=chain.request ();   响应响应=chain.proceed(请求);   字符串缓存=request.header(缓存时间);   如果(! Util.checkNULL(缓存)){//缓存时间不为空   响应response1=response.newBuilder ()   .removeHeader(“杂注”)   .removeHeader (cache - control)//缓存缓存秒   .header (“cache - control”、“信息=" +缓存)   .build ();   返回response1;   其他}{   返回响应;   }   }   }   之前      

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

        公开课CacheProvide {   上下文mContext;      公共CacheProvide(上下文语境){   mContext=上下文;   }      公共缓存provideCache(){//使用应用缓存文件路径,缓存大小为10 mb   返回新的缓存(mContext.getCacheDir (), 10240 * 1024);   }   }      之前      

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

  

<强>下面我们开始配置OkHttpClient

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

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

  

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

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