1. 程式人生 > >Android 網路開發(一) okHttp網路請求之快取控制Cache-Control

Android 網路開發(一) 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());
        }

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;
            }
        });