通過緩存處理可以有效降低服務(wù)器的負(fù)荷,加快APP界面加載速度,提升用戶體驗(yàn)。Retrofit + OkHttp緩存處理流程是這樣的,請(qǐng)求響應(yīng)之后會(huì)在data/data/packageName/cache下建立一個(gè)response文件夾,保存緩存數(shù)據(jù),后續(xù)請(qǐng)求時(shí)若無網(wǎng)絡(luò),則直接讀取緩存內(nèi)容,若有網(wǎng)絡(luò)則從網(wǎng)絡(luò)獲取最新數(shù)據(jù)并緩存。
1.設(shè)置緩存路徑,大小及添加緩存攔截器
//設(shè)置緩存路徑File httpCacheDirectory = new File(CommonApplication.getInstance().getCacheDir(), "responses");//設(shè)置緩存 10MCache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);//創(chuàng)建OkHttpClient,并添加攔截器和緩存代碼OkHttpClient client = new OkHttpClient.Builder() .addNetworkInterceptor(new CacheInterceptor(CommonApplication.getInstance())) .cache(cache).build();
2.定義緩存攔截器。若網(wǎng)絡(luò)正常,則緩存有效期1分鐘;若網(wǎng)絡(luò)異常,則緩存有效期6小時(shí)
public class CacheInterceptor implements Interceptor { private Context mContext; public CacheInterceptor(Context context) { mContext = context; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (NetworkUtils.isNetworkAvailable(mContext)) {//沒網(wǎng)強(qiáng)制從緩存讀取(必須得寫,不然斷網(wǎng)狀態(tài)下,退出應(yīng)用,或者等待一分鐘后,就獲取不到緩存) request = request.newBuilder() .cacheControl(CacheControl.FORCE_CACHE) .build(); } Response response = chain.proceed(request); Response responseLatest; if (NetworkUtils.isNetworkAvailable(mContext)) { int maxAge = 60; //有網(wǎng)失效一分鐘 responseLatest = response.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { int maxStale = 60 * 60 * 6; // 沒網(wǎng)失效6小時(shí) responseLatest = response.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } return responseLatest; }}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注