Retrofit + OkHttp緩存處理的示例代碼
通過緩存處理可以有效降低服務(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è)置緩存 10M
Cache 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;
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android使用ExpandableListView實(shí)現(xiàn)三層嵌套折疊菜單
這篇文章主要介紹了Android使用ExpandableListView實(shí)現(xiàn)三層嵌套折疊菜單,對(duì)布局感興趣的同學(xué)可以參考下2021-04-04
Android實(shí)現(xiàn)可輸入數(shù)據(jù)的彈出框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)可輸入數(shù)據(jù)的彈出框,文章提供了兩種方式,示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01
Android Studio 設(shè)置代碼提示和代碼自動(dòng)補(bǔ)全快捷鍵方式
這篇文章主要介紹了Android Studio 設(shè)置代碼提示和代碼自動(dòng)補(bǔ)全快捷鍵方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-03-03
詳解Android自定義控件屬性TypedArray以及attrs
這篇文章主要為大家介紹了android自定義控件屬性TypedArray以及attrs,感興趣的小伙伴們可以參考一下2016-01-01
Android Studio實(shí)現(xiàn)補(bǔ)間動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android Studio實(shí)現(xiàn)補(bǔ)間動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
詳解Android WebView的input上傳照片的兼容問題
本篇文章主要介紹了詳解Android WebView的input上傳照片的兼容問題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08
Android實(shí)現(xiàn)自動(dòng)變換大小的組件ViewPager2
這篇文章主要介紹了Android實(shí)現(xiàn)自動(dòng)變換大小的組件ViewPager2,ViewPager2最顯著的特點(diǎn)是基于RecyclerView實(shí)現(xiàn),RecyclerView是目前Android端最成熟的AdapterView解決方案2023-03-03

