中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-13 19:48:26 來源:腳本之家 閱讀:264 作者:gengqiquan 欄目:移動開發

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”)就可以把當前數據緩存一天啦

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绩溪县| 仲巴县| 滕州市| 四子王旗| 霍山县| 凌海市| 黎城县| 那曲县| 广宁县| 通化市| 镇坪县| 新泰市| 榆中县| 濮阳市| 通城县| 千阳县| 通州区| 南平市| 徐闻县| 屏山县| 贵德县| 临潭县| 遂宁市| 阳朔县| 获嘉县| 嘉定区| 永清县| 新晃| 彝良县| 普宁市| 常熟市| 曲阳县| 黄龙县| 广昌县| 阿克| 封开县| 东丰县| 电白县| 墨玉县| 资兴市| 黎城县|