Android的HTTP擴展包OkHttp中的緩存功能使用方法解析
OkHttp 可以對 HTTP 響應的內(nèi)容在磁盤上進行緩存。在進行 HTTP 請求時,如果該請求的響應已經(jīng)被緩存而且沒有過期,OkHttp 會直接使用緩存中的響應內(nèi)容,而不需要真正的發(fā)出 HTTP 請求到遠程服務器。在創(chuàng)建緩存時需要指定一個磁盤目錄和緩存的大小。在代碼清單 8 中,創(chuàng)建出 Cache 對象之后,通過 OkHttpClient 的 setCache 進行設置。通過 Response 對象的 cacheResponse 和 networkResponse 方法可以得到緩存的響應和從實際的 HTTP 請求得到的響應。如果該請求的響應來自實際的網(wǎng)絡請求,則 cacheResponse 方法的返回值為 null;如果響應來自緩存,則 networkResponse 的返回值為 null。OkHttp 在進行緩存時會遵循 HTTP 協(xié)議的要求,因此可以通過標準的 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指示響應可被任何緩存區(qū)緩存。
Private指示對于單個用戶的整個或部分響應消息,不能被共享緩存處理。這允許服務器僅僅描述當用戶的部分響應消息,此響應消息對于其他用戶的請求無效。
(1)no-cache指示請求或響應消息不能緩存
(2)no-store用于防止重要的信息被無意的發(fā)布。在請求消息中發(fā)送將使得請求和響應消息都不使用緩存。
(3)max-age指示客戶機可以接收生存期不大于指定時間(以秒為單位)的響應。
(4)min-fresh指示客戶機可以接收響應時間小于當前時間加上指定時間的響應。
(5)max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那么客戶機可以接收超出超時期指定值之內(nèi)的響應消息。
CacheControl類詳細介紹:
1.)常用的函數(shù):如下代碼,里面已經(jīng)加了注釋就不一一解釋了,每個函數(shù)都是對應一個緩存指令設置
final CacheControl.Builder builder = new CacheControl.Builder();
builder.noCache();//不使用緩存,全部走網(wǎng)絡
builder.noStore();//不使用緩存,也不存儲緩存
builder.onlyIfCached();//只使用緩存
builder.noTransform();//禁止轉(zhuǎn)碼
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;// 僅僅使用網(wǎng)絡
舉例,我們設置一個有效期為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而不會發(fā)起網(wǎng)絡請求,若過期會自動發(fā)起網(wǎng)絡請求。注意:如果您使用FORCE_CACHE和網(wǎng)絡的響應需求,OkHttp則會返回一個504提示,告訴你不可滿足請求響應。所以我們加一個判斷在沒有網(wǎng)絡的情況下使用
//判斷網(wǎng)絡是否連接
boolean connected = NetworkUtil.isConnected(context);
if (!connected) {
request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
}
相關文章
Android BroadcastReceiver傳輸機制詳解
Android開發(fā)的四大組件分別是:活動(activity),用于表現(xiàn)功能;服務(service),后臺運行服務,不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個應用中存儲和讀取數(shù)據(jù),相當于數(shù)據(jù)庫,本篇著重介紹廣播組件2023-01-01
靈活使用Android中ActionBar和ViewPager切換頁面
這篇文章主要介紹了如何靈活使用Android中ActionBar和ViewPager切換頁面,感興趣的小伙伴們可以參考一下2015-12-12
Android Activity 與Service進行數(shù)據(jù)交互詳解
這篇文章主要介紹了Android Activity 與Service進行數(shù)據(jù)交互的相關資料,在開發(fā)Android App的時候經(jīng)常會使用這樣的功能,需要的朋友可以參考下2016-10-10
Android WebView支持input file啟用相機/選取照片功能
這篇文章主要介紹了Android-WebView支持input file啟用相機/選取照片功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08
Android開發(fā)中多進程共享數(shù)據(jù)簡析
這篇文章主要為大家簡單分析Android開發(fā)中多進程共享數(shù)據(jù),怎么做才能讓這兩邊共享數(shù)據(jù),感興趣的小伙伴們可以參考一下2016-04-04
Android仿微信錄音功能(錄音后的raw文件轉(zhuǎn)mp3文件)
這篇文章主要介紹了Android中仿微信錄音功能錄音后的raw文件轉(zhuǎn)mp3文件,本文通過實例代碼給大家講解的非常詳細,需要的朋友可以參考下2019-11-11
Android中實現(xiàn)監(jiān)聽ScrollView滑動事件
這篇文章主要介紹了Android中實現(xiàn)監(jiān)聽ScrollView滑動事件,本文用重寫ScrollView類的方法實現(xiàn)了一些擴展功能,需要的朋友可以參考下2015-05-05
Android開發(fā)之EditText框輸入清理工具類示例
這篇文章主要介紹了Android開發(fā)之EditText框輸入清理工具類,涉及Android事件監(jiān)聽及輸入框清理相關操作技巧,需要的朋友可以參考下2018-01-01
Android自定義View實現(xiàn)環(huán)形進度條的思路與實例
最近看到豆瓣FM的音樂播放界面,有一個環(huán)形的進度條挺不錯的,最近有空就想著實現(xiàn)了,所以下面這篇文章主要給大家介紹了Android自定義View實現(xiàn)環(huán)形進度條的思路與實例,需要的朋友可以參考借鑒,下面來一起看看吧。2017-04-04

