要求是每次網絡請求以前都去取一遍緩存,若是有緩存則處理緩存數據刷新界面,繼續走正常的網絡請求,網絡請求成功以後處理數據刷新界面,更新緩存,若是請求失敗,給出提示相似於Toaste這種輕量級的提示;若是沒有緩存,繼續走正常的網絡請求,網絡請求成功以後處理數據刷新界面,更新緩存,若是請求失敗,給出提示這個時候須要錯誤頁面這種重量級的提示。這樣的好處是對於某些實時性要求不高的接口,在網絡狀況或者接口不穩定的狀況下,用戶能夠繼續操做,提高用戶體驗。流程圖以下:緩存
OkHttp3自己是支持緩存的,只是默認沒有開啓須要配置,以下bash
okHttpClientBuilder.cache(new Cache(new File(XHttpManager.getInstance().getApplication().getCacheDir(), "OkHttpCache"),
XHttpManager.getInstance().getCacheSize()));
複製代碼
重點看下Cache這個類的構造方法以下:網絡
public Cache(File directory, long maxSize) {
this(directory, maxSize, FileSystem.SYSTEM);
}
複製代碼
第一個參數表示的是緩存路勁,推薦放到data/data/應用包名/cache目錄下,這樣的話用戶清理緩存或者卸載應用的時候會一同被清理,也不須要特別處理文件外部寫入以及讀取的權限,第二個參數是緩存文件的總大小,超過這個大小會觸發OkHttp的Lru機制進行處理,不宜過大也不宜太小。ide
public class XCacheInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
okhttp3.Response originalResponse = chain.proceed(chain.request());
String cacheControl = originalResponse.header("Cache-Control");
Log.d("XCacheInterceptor", "cacheControl =" + cacheControl);
if (cacheControl == null || cacheControl.contains("no-store") || cacheControl.contains("no-cache") ||
cacheControl.contains("must-revalidate")) {
return originalResponse.newBuilder()
.removeHeader("Pragma")
.header("Cache-Control", "public, max-age=0")
.build();
}
return originalResponse;
}
}
複製代碼
能夠看到咱們只是對一些不支持緩存的接口的頭信息進行修改以支持緩存。接下來咱們把攔截器配置到OkhttpClient裏面,以下:ui
okHttpClientBuilder.addNetworkInterceptor(new XCacheInterceptor());
複製代碼
注意這裏要使用addNetworkInterceptor而不是addInterceptor由於咱們只是對頭信息進行修改,對請求的結果不須要特殊處理。 到這裏其實關於OkHttp3的緩存就處理好了,另外須要在讀取緩存的時候強制讀取緩存,網絡請求的時候強制獲取網絡數據避免數據紊亂this
XRequestBuilder builder = XRequestBuilder.create();
if (isCache) {
builder.cacheControl(CacheControl.FORCE_CACHE);
} else {
builder.cacheControl(CacheControl.FORCE_NETWORK);
}
複製代碼