編輯:關於Android編程
OkHttp 可以對 HTTP 響應的內容在磁盤上進行緩存。在進行 HTTP 請求時,如果該請求的響應已經被緩存而且沒有過期,OkHttp 會直接使用緩存中的響應內容,而不需要真正的發出 HTTP 請求到遠程服務器。在創建緩存時需要指定一個磁盤目錄和緩存的大小。在代碼清單 8 中,創建出 Cache 對象之後,通過 OkHttpClient 的 setCache 進行設置。通過 Response 對象的 cacheResponse 和 networkResponse 方法可以得到緩存的響應和從實際的 HTTP 請求得到的響應。如果該請求的響應來自實際的網絡請求,則 cacheResponse 方法的返回值為 null;如果響應來自緩存,則 networkResponse 的返回值為 null。OkHttp 在進行緩存時會遵循 HTTP 協議的要求,因此可以通過標准的 HTTP 頭 Cache-Control 來控制響應的緩存時間。
設置響應緩存的示例
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("服務器端錯誤: " + response); } System.out.println(response.cacheResponse()); System.out.println(response.networkResponse()); } }
Cache-Control
Cache-Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置Cache-Control並不會修改另一個消息處理過程中的緩存處理過程。請求時的緩存指令有下幾種:
Public指示響應可被任何緩存區緩存。
Private指示對於單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其他用戶的請求無效。
(1)no-cache指示請求或響應消息不能緩存
(2)no-store用於防止重要的信息被無意的發布。在請求消息中發送將使得請求和響應消息都不使用緩存。
(3)max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。
(4)min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。
(5)max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那麼客戶機可以接收超出超時期指定值之內的響應消息。
CacheControl類詳細介紹:
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(); }
今天看了鴻洋_大神在慕課網講的qq5.0側滑菜單。學了不少的知識,同時也佩服鴻洋_大神思路的清晰。看了教程課下也自己實現了一下。代碼幾乎完全相同 別噴我啊。。沒辦法 o(
對於煤油來說,有了魅族mSupport遠程支持服務無論你在任何地方,只需要連接上 Wi-Fi ,即可享受魅族的技術支持顧問的遠程支援服務,無須動手即可由技術
1,intentfilter說明:如果說是將一個activity有其他應用打開,或者是在webView 或者 bybird app中調用我們自己的activi
前言WebView(網絡視圖)在Andorid中就是用來顯示網頁的,下面我們來一起看看它是如何使用的。一、基本使用1.聲明權限,WebView不可避免地要用到網絡,我們要