亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android 中okhttp自定義Interceptor(緩存攔截器)

 更新時(shí)間:2017年03月27日 15:52:18   作者:gengqiquan  
這篇文章主要介紹了Android 中okhttp自定義Interceptor(緩存攔截器)的相關(guān)資料,需要的朋友可以參考下

Android 中okhttp自定義Interceptor(緩存攔截器)

前言:

新公司項(xiàng)目是沒有緩存的,我的天,坑用戶流量不是么。不知道有人就喜歡一個(gè)界面沒事點(diǎn)來點(diǎn)去的么。怎么辦?一個(gè)字“加”。

由于項(xiàng)目的網(wǎng)絡(luò)請(qǐng)求被我換成了retrofit。而retrofit的網(wǎng)絡(luò)請(qǐng)求默認(rèn)基于okhttp

okhttp的緩存由返回的header 來決定。如果服務(wù)器支持緩存的話返回的headers里面會(huì)有這一句

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

這里的time是一個(gè)單位為秒的時(shí)間長度。意思是緩存的時(shí)效,比如要設(shè)置這個(gè)API的緩存時(shí)效為一天

返回的header就應(yīng)該是

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

不巧。公司的服務(wù)器不支持緩存的,怎么看出來的?因?yàn)槲覀兊姆祷氐膆eaders是包含這些的

但我們又想用緩存,這個(gè)時(shí)候怎么辦呢。,得益于okhttp的Interceptor機(jī)制,一切的配置都可以變得那么簡單優(yōu)雅。

我們可以在攔截器里截獲headers然后移除默認(rèn)的Cache-Control

但是我們知道有些API返回的數(shù)據(jù)適合緩存,而有些是不適合的,比如資訊列表,各種更新頻率比較高的,是不可以緩存的,而像資訊詳情這種數(shù)據(jù)是可以緩存的。所以我們不能直接統(tǒng)一寫死。需要?jiǎng)討B(tài)配置。

同樣的,我們也在header里面作文章,自定義一個(gè)header。注意這個(gè)header一定不能被其他地方使用,不然會(huì)被覆蓋值。這里我們定義的header的key名字為:Cache-Time。我們?cè)跀r截器里去取這個(gè)header。如果取得了不為空的值,說明這個(gè)請(qǐng)求是要支持緩存的,緩存的時(shí)間就是Cache-Time對(duì)應(yīng)的值。我們把他添加進(jìn)去。

自定義緩存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)) {//緩存時(shí)間不為空
      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;
    }
  }
}

緩存攔截器定義好了,我們還需要配置緩存的路徑。這里我們定義一個(gè)緩存的內(nèi)容提供器

public class CacheProvide {
  Context mContext;

  public CacheProvide(Context context) {
    mContext = context;
  }

  public Cache provideCache() {//使用應(yīng)用緩存文件路徑,緩存大小為10MB
    return new Cache(mContext.getCacheDir(), 10240 * 1024);
  }
}

通過上面的代碼我們可以看到我們指定了緩存的大小為10MB。這里如果緩存的數(shù)據(jù)量大于這個(gè)值,內(nèi)部會(huì)使用lur規(guī)則進(jìn)行刪除。

下面我們開始配置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();

好了,現(xiàn)在我們?nèi)绻睦镄枰彺鏀?shù)據(jù)的話,只要在請(qǐng)求里添加header(“Cache-Time”,“3600*24”)就可以把當(dāng)前數(shù)據(jù)緩存一天啦

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論