Android探索之基於okHttp打造自己的網路請求<Cache-Control>(四)

來源:互聯網
上載者:User

標籤:

前言:

    前面的學習基本上已經可以完成開發需求了,但是在項目中有時會遇到對請求做個緩衝,當沒網路的時候優先載入本機快取,基於這個需求我們來學習一直okHttp的Cache-Control。

Cache-Control:

     Cache-Control指定請求和響應遵循的緩衝機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另一個訊息處理過程中的緩衝處理過程。請求時的緩衝指令有下幾種:

  • Public指示響應可被任何緩衝區緩衝。
  • Private指示對於單個使用者的整個或部分響應訊息,不能被共用快取處理。這允許伺服器僅僅描述當使用者的部分響應訊息,此響應訊息對於其他使用者的請求無效。
  • no-cache指示請求或響應訊息不能緩衝
  • no-store用於防止重要的資訊被無意的發布。在請求訊息中發送將使得請求和響應訊息都不使用緩衝。
  • max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
  • min-fresh指示客戶機可以接收回應時間小於目前時間加上指定時間的響應。
  • max-stale指示客戶機可以接收超出逾時期間的響應訊息。如果指定max-stale訊息的值,那麼客戶機可以接收超出逾時期指定值之內的響應訊息。

 

CacheControl.java類介紹:   1.)常用的函數:如下代碼,裡面已經加了注釋就不一一解釋了,每個函數都是對應一個緩衝指令設定
           final CacheControl.Builder builder = new CacheControl.Builder();            builder.noCache();//不使用緩衝,全部走網路            builder.noStore();//不使用緩衝,也不儲存緩衝            builder.onlyIfCached();//只使用緩衝            builder.noTransform();//禁止轉碼            builder.maxAge(10, TimeUnit.MILLISECONDS);//指示客戶機可以接收生存期不大於指定時間的響應。            builder.maxStale(10, TimeUnit.SECONDS);//指示客戶機可以接收超出逾時期間的響應訊息            builder.minFresh(10, TimeUnit.SECONDS);//指示客戶機可以接收回應時間小於目前時間加上指定時間的響應。            CacheControl cache = builder.build();//cacheControl
 2.)兩個CacheControl常量介紹:
            CacheControl.FORCE_CACHE; //僅僅使用緩衝            CacheControl.FORCE_NETWORK;// 僅僅使用網路

舉例,我們設定一個有效期間為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("伺服器錯誤", callBack);                    }                }            });            return call;        } catch (Exception e) {            Log.e(TAG, e.toString());        }

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

       //判斷網路是否串連        boolean connected = NetworkUtil.isConnected(context);         if (!connected) {             request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();          }
okHtitp知識擴充:1.)Interceptor攔截器,見名知意就是攔截操作,這裡用來攔截Request對其做一些特殊處理,舉例:比如上面我們使用到了CacheControl,我們怎麼攔截一個請求在網路停用時候使用CacheControl.FORCE_CACHE;
        OkHttpClient.Builder newBuilder = mOkHttpClient.newBuilder();         newBuilder.addInterceptor(new Interceptor() {            @Override            public Response intercept(Chain chain) throws IOException {                Request request = chain.request();                boolean connected = NetworkUtil.isConnected(context);                if (!connected) {                    request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();                }                Response response = chain.proceed(request);                return response;            }        });
2.)OkHttp 提供了對使用者認證的支援。當 HTTP 響應的狀態碼是 401 時,OkHttp 會從設定的 Authenticator 對象中擷取到新的 Request 對象並再次嘗試發出請求。Authenticator 介面中的 authenticate 方法用來提供進行認證的 Request 對象.
        OkHttpClient client = new OkHttpClient();        client.newBuilder().authenticator(new Authenticator() {            @Override            public Request authenticate(Route route, Response response) throws IOException {                String credential = Credentials.basic("user", "password");                return response.request().newBuilder()                        .header("Authorization", credential)                        .build();            }        });

小結:okHttp的簡單使用到此介紹完畢,至於很多進階使用還有待研究。接下來準備研究下OkHttp與retrofitde結合使用。

 

Android探索之基於okHttp打造自己的網路請求<Cache-Control>(四)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.