最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android的HTTP擴展包OkHttp中的緩存功能使用方法解析

 更新時間:2016年07月13日 12:06:06   作者:總李寫代碼  
OkHttp(GitHub主頁https://github.com/square/okhttp)是一款高人氣的第三方Android網(wǎng)絡(luò)編程包,這里我們來看一下Android的HTTP擴展包OkHttp中的緩存功能使用方法解析:

OkHttp 可以對 HTTP 響應(yīng)的內(nèi)容在磁盤上進行緩存。在進行 HTTP 請求時,如果該請求的響應(yīng)已經(jīng)被緩存而且沒有過期,OkHttp 會直接使用緩存中的響應(yīng)內(nèi)容,而不需要真正的發(fā)出 HTTP 請求到遠程服務(wù)器。在創(chuàng)建緩存時需要指定一個磁盤目錄和緩存的大小。在代碼清單 8 中,創(chuàng)建出 Cache 對象之后,通過 OkHttpClient 的 setCache 進行設(shè)置。通過 Response 對象的 cacheResponse 和 networkResponse 方法可以得到緩存的響應(yīng)和從實際的 HTTP 請求得到的響應(yīng)。如果該請求的響應(yīng)來自實際的網(wǎng)絡(luò)請求,則 cacheResponse 方法的返回值為 null;如果響應(yīng)來自緩存,則 networkResponse 的返回值為 null。OkHttp 在進行緩存時會遵循 HTTP 協(xié)議的要求,因此可以通過標準的 HTTP 頭 Cache-Control 來控制響應(yīng)的緩存時間。

設(shè)置響應(yīng)緩存的示例

public class CacheResponse {
  public static void main(String[] args) throws IOException {
  int cacheSize = 100 * 1024 * 1024;
  File cacheDirectory = Files.createTempDirectory("cache").toFile();
  Cache cache = new Cache(cacheDirectory, cacheSize);
  OkHttpClient client = new OkHttpClient();
  client.setCache(cache);

  Request request = new Request.Builder()
      .url("http://www.baidu.com")
      .build();

  Response response = client.newCall(request).execute();
  if (!response.isSuccessful()) {
    throw new IOException("服務(wù)器端錯誤: " + response);
  }

  System.out.println(response.cacheResponse());
  System.out.println(response.networkResponse());
  }
}

Cache-Control
Cache-Control指定請求和響應(yīng)遵循的緩存機制。在請求消息或響應(yīng)消息中設(shè)置Cache-Control并不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令有下幾種:
Public指示響應(yīng)可被任何緩存區(qū)緩存。
Private指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當用戶的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。
(1)no-cache指示請求或響應(yīng)消息不能緩存
(2)no-store用于防止重要的信息被無意的發(fā)布。在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存。
(3)max-age指示客戶機可以接收生存期不大于指定時間(以秒為單位)的響應(yīng)。
(4)min-fresh指示客戶機可以接收響應(yīng)時間小于當前時間加上指定時間的響應(yīng)。
(5)max-stale指示客戶機可以接收超出超時期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內(nèi)的響應(yīng)消息。
CacheControl類詳細介紹:
1.)常用的函數(shù):如下代碼,里面已經(jīng)加了注釋就不一一解釋了,每個函數(shù)都是對應(yīng)一個緩存指令設(shè)置

          

final CacheControl.Builder builder = new CacheControl.Builder();
     builder.noCache();//不使用緩存,全部走網(wǎng)絡(luò)
      builder.noStore();//不使用緩存,也不存儲緩存
      builder.onlyIfCached();//只使用緩存
      builder.noTransform();//禁止轉(zhuǎn)碼
      builder.maxAge(10, TimeUnit.MILLISECONDS);//指示客戶機可以接收生存期不大于指定時間的響應(yīng)。
      builder.maxStale(10, TimeUnit.SECONDS);//指示客戶機可以接收超出超時期間的響應(yīng)消息
      builder.minFresh(10, TimeUnit.SECONDS);//指示客戶機可以接收響應(yīng)時間小于當前時間加上指定時間的響應(yīng)。
      CacheControl cache = builder.build();//cacheControl

2.)兩個CacheControl常量介紹:

     CacheControl.FORCE_CACHE; //僅僅使用緩存
      CacheControl.FORCE_NETWORK;// 僅僅使用網(wǎng)絡(luò)


舉例,我們設(shè)置一個有效期為10秒的CacheControl

 

      final CacheControl.Builder builder = new CacheControl.Builder();
      builder.maxAge(10, TimeUnit.MILLISECONDS);
      CacheControl cache = builder.build();

3.)請求時如何使用

final CacheControl.Builder builder = new CacheControl.Builder();
      builder.maxAge(10, TimeUnit.MILLISECONDS);
      CacheControl cache = builder.build();
      final Request request = new Request.Builder().cacheControl(cache).url(requestUrl).build();
      final Call call = mOkHttpClient.newCall(request);//
      call.enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
          failedCallBack("訪問失敗", callBack);
          Log.e(TAG, e.toString());
        }

        @Override
        public void onResponse(Call call, Response response) throws IOException {
          if (response.isSuccessful()) {
            String string = response.body().string();
            Log.e(TAG, "response ----->" + string);
            successCallBack((T) string, callBack);
          } else {
            failedCallBack("服務(wù)器錯誤", callBack);
          }
        }
      });
      return call;
    } catch (Exception e) {
      Log.e(TAG, e.toString());
    }

以上如果cache沒有過去會直接返回cache而不會發(fā)起網(wǎng)絡(luò)請求,若過期會自動發(fā)起網(wǎng)絡(luò)請求。注意:如果您使用FORCE_CACHE和網(wǎng)絡(luò)的響應(yīng)需求,OkHttp則會返回一個504提示,告訴你不可滿足請求響應(yīng)。所以我們加一個判斷在沒有網(wǎng)絡(luò)的情況下使用

    //判斷網(wǎng)絡(luò)是否連接
    boolean connected = NetworkUtil.isConnected(context);
     if (!connected) {
       request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
     }

相關(guān)文章

最新評論

宁远县| 兴山县| 永和县| 柯坪县| 汕尾市| 巴中市| 宁安市| 东辽县| 赣榆县| 方山县| 海兴县| 宝山区| 邵阳市| 桐柏县| 芜湖县| 漯河市| 呼玛县| 嘉祥县| 富锦市| 剑川县| 大渡口区| 玉树县| 景泰县| 卓尼县| 布拖县| 仁怀市| 平顶山市| 洛宁县| 乳源| 晋宁县| 建瓯市| 水富县| 汉寿县| 裕民县| 苏州市| 平昌县| 台东市| 抚顺市| 临湘市| 遂宁市| 师宗县|