OkHttp基本使用(四)快取
阿新 • • 發佈:2019-01-02
此篇介紹OkHttp的快取功能,實現無網路情況下從快取讀取資料,類似很多新聞類的APP,在沒有網路的情況下也是可以進入首頁。除了新聞類,可能還有閱讀類的app也需要快取功能,等等。總之快取在實際專案開發中使用得比較平凡,而如果要我們自己去寫一套快取邏輯,顯然是很麻煩的。接下來,介紹OkHttp的快取功能的使用。
2、在一般情況下,不需要做額外的配置,OkHttp在沒有網路的情況下,會自動請求快取資訊。但於此同時,網路請求失敗會出現異常(已經捕獲),通過異常可以做一些邏輯相關的處理。
-
配置快取大小和快取目錄
-
//獲得快取目錄
-
File cacheFile = getCacheDir();
-
okHttpClient = new OkHttpClient
-
.Builder()
-
.cache(new Cache(cacheFile,4*1024*1024)) //設定快取目錄和快取大小
- .build();
-
強制請求網路(經過測試,此種方式還是會寫入快取,只是沒有讀取快取內容)
-
<div>Request request = new Request.Builder()
-
.cacheControl(new CacheControl.Builder().noCache().build())//設定不讀取快取,直接進行網路請求
- .url("http://publicobject.com/helloworld.txt")</div><div> .build();</div>
-
強制讀取快取。也就是不管快取是否有資料,都不請求網路。
-
Request request = new Request.Builder()
-
.cacheControl(new CacheControl.Builder()
-
.onlyIfCached()
-
.build())
-
.url("http://publicobject.com/helloworld.txt")
-
.build();
-
Response forceCacheResponse = client.newCall(request).execute();
-
if (forceCacheResponse.code() != 504) {
-
// The resource was cached! Show it.
-
} else {
-
// The resource was not cached.
- }
-
Request request = builder.url(Config.URL).cacheControl(CacheControl.FORCE_CACHE).build();
-
Response response1 = okHttpClient.newCall(request).execute();
-
String result1 = null;
-
if (response1.code() != 504) {
-
result1 = response1.body().string();
-
} else {
-
System.out.println("-androidxx--null");
- }
-
沒有網路自動取快取(預設方式)
-
Request request = builder.url("https://publicobject.com/helloworld.txt").build();
- Response response1 = okHttpClient.newCall(request).execute();
-
Request request = builder.url("https://publicobject.com/helloworld.txt").build();
-
OkHttp獲取快取資訊的原始碼:(這是OkHttp中Cache類的原始碼中的一部分)
-
Response get(Request request) {
-
String key = urlToKey(request);
-
DiskLruCache.Snapshot snapshot;
-
Entry entry;
-
try {
-
snapshot = cache.get(key);
-
if (snapshot == null) {
-
return null;
-
}
-
} catch (IOException e) {
-
// Give up because the cache cannot be read.
-
return null;
- }
-
Response get(Request request) {
- Response response = okHttpClient.cache().get(request);//get方法預設是看不到的,需要修改原始碼
-
總結
2、在一般情況下,不需要做額外的配置,OkHttp在沒有網路的情況下,會自動請求快取資訊。但於此同時,網路請求失敗會出現異常(已經捕獲),通過異常可以做一些邏輯相關的處理。