1. 程式人生 > >OkHttp基本使用(四)快取

OkHttp基本使用(四)快取

此篇介紹OkHttp的快取功能,實現無網路情況下從快取讀取資料,類似很多新聞類的APP,在沒有網路的情況下也是可以進入首頁。除了新聞類,可能還有閱讀類的app也需要快取功能,等等。總之快取在實際專案開發中使用得比較平凡,而如果要我們自己去寫一套快取邏輯,顯然是很麻煩的。接下來,介紹OkHttp的快取功能的使用。
  • 配置快取大小和快取目錄
  1. //獲得快取目錄
  2.         File cacheFile = getCacheDir();
  3.         okHttpClient = new OkHttpClient
  4.                 .Builder()
  5.                 .cache(new Cache(cacheFile,4*1024*1024)) //設定快取目錄和快取大小
  6.                 .build();
複製程式碼 注意:快取目錄最好是私有快取。一個APP、一個OkHttpClient物件、一個快取目錄。再次強調對於專案中的OkHttpClient需要是單例的--官方推薦。
  • 強制請求網路(經過測試,此種方式還是會寫入快取,只是沒有讀取快取內容)
  1. <div>Request request = new Request.Builder()
  2.         .cacheControl(new CacheControl.Builder().noCache().build())//設定不讀取快取,直接進行網路請求
  3.         .url("http://publicobject.com/helloworld.txt")</div><div>        .build();</div>
複製程式碼
  • 強制讀取快取。也就是不管快取是否有資料,都不請求網路。
  1. Request request = new Request.Builder()
  2.           .cacheControl(new CacheControl.Builder()
  3.               .onlyIfCached()
  4.               .build())
  5.           .url("http://publicobject.com/helloworld.txt")
  6.           .build();
  7.       Response forceCacheResponse = client.newCall(request).execute();
  8.       if (forceCacheResponse.code() != 504) {
  9.         // The resource was cached! Show it.
  10.       } else {
  11.         // The resource was not cached.
  12.       }
複製程式碼 強制讀取快取的第2中寫法(其實內部程式碼和上面的寫法一致):
  1. Request request = builder.url(Config.URL).cacheControl(CacheControl.FORCE_CACHE).build();
  2.                     Response response1 = okHttpClient.newCall(request).execute();
  3.                     String result1 = null;
  4.                     if (response1.code() != 504) {
  5.                         result1 = response1.body().string();
  6.                     } else {
  7.                         System.out.println("-androidxx--null");
  8.                     }
複製程式碼 強制讀取快取的測試過程:先成功請求一次,然後將網路斷開,使用強制取快取的方式,可以將快取的結果請求到。
  • 沒有網路自動取快取(預設方式
    1. Request request = builder.url("https://publicobject.com/helloworld.txt").build();
    2.                     Response response1 = okHttpClient.newCall(request).execute();
    複製程式碼 OkHttp設定了快取大小和目錄之後,預設的網路請求方式是如果沒有網路或者網路連線失敗,會返回快取中的資訊。
  • OkHttp獲取快取資訊的原始碼:(這是OkHttp中Cache類的原始碼中的一部分)
    1. Response get(Request request) {
    2.     String key = urlToKey(request);
    3.     DiskLruCache.Snapshot snapshot;
    4.     Entry entry;
    5.     try {
    6.       snapshot = cache.get(key);
    7.       if (snapshot == null) {
    8.         return null;
    9.       }
    10.     } catch (IOException e) {
    11.       // Give up because the cache cannot be read.
    12.       return null;
    13.     }
    複製程式碼 通過以上原始碼,可以看到有一個大家比較熟悉的類DiskLruCache,這就是一個磁碟快取的工具類,OkHttp中使用的就是DiskLruCache進行的快取。
      如果想直接取快取資訊,可以將原始碼中的Cache類的get方法的限定修飾符改成public,然後可以通過如下方式直接讀取快取內容:
  1. Response response = okHttpClient.cache().get(request);//get方法預設是看不到的,需要修改原始碼
複製程式碼


  • 總結
1、使用快取功能,一定要先配置快取目錄和大小。
2、在一般情況下,不需要做額外的配置,OkHttp在沒有網路的情況下,會自動請求快取資訊。但於此同時,網路請求失敗會出現異常(已經捕獲),通過異常可以做一些邏輯相關的處理。