Retrofit 碰声、RxJava以及OkHttp 都是最近非常火的開源框架熬甫,通過Retrofit 胰挑、RxJava以及OkHttp的結(jié)合,可以非常便捷地實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求。但是在使用之前瞻颂,我們經(jīng)常需要對(duì)Retrofit進(jìn)行一些基礎(chǔ)配置豺谈,來實(shí)現(xiàn)更好的網(wǎng)絡(luò)請(qǐng)求,比如設(shè)置 Json 轉(zhuǎn)換器贡这、RxJava 適配器茬末、設(shè)置 Debug Log 模式、設(shè)置超時(shí)盖矫、錯(cuò)誤重連丽惭,以及配置緩存等等一些內(nèi)容。今天就主要分享一下這方面的內(nèi)容辈双。
引入依賴
//引入okhttp
compile 'com.squareup.okhttp3:okhttp:3.5.0'
//引入retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
//引入rxjava
compile 'io.reactivex.rxjava2:rxjava:2.0.4'
//引入Log攔截器责掏,方便DEBUG模式輸出log信息
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
//引入rxjava適配器,方便rxjava與retrofit的結(jié)合
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//引入json轉(zhuǎn)換器辐马,方便將返回的數(shù)據(jù)轉(zhuǎn)換為json格式
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
//引入rxandroid
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
從引入的依賴便可看出本篇文章以常用的一些網(wǎng)絡(luò)請(qǐng)求為例拷橘。采用RxJava和Retroifit結(jié)合的方式,返回的數(shù)據(jù)json格式喜爷。
下面開始一步步配置Retrofit常用的網(wǎng)絡(luò)請(qǐng)求配置冗疮。
Log信息攔截器
// log用攔截器
HttpLoggingInterceptor loggingInterceptor= new HttpLoggingInterceptor();
// 開發(fā)模式記錄整個(gè)body,否則只記錄基本信息如返回200檩帐,http協(xié)議版本等
if (BuildConfig.DEBUG) {
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
} else {
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
}
HttpLoggingInterceptor 是一個(gè)攔截器术幔,用于輸出網(wǎng)絡(luò)請(qǐng)求和結(jié)果的 Log,可以配置 level 為 BASIC / HEADERS / BODY湃密。通過Log信息攔截器方便我們進(jìn)行調(diào)試诅挑,驗(yàn)證網(wǎng)絡(luò)請(qǐng)求結(jié)果。
OkHttpClient.Builder builder= new OkHttpClient.Builder();
builder.addInterceptor(loggingInterceptor);
向okhttp中添加攔截器泛源。攔截器的功能很強(qiáng)大拔妥,關(guān)于攔截器,可以看這篇文章了解达箍。
緩存機(jī)制
無網(wǎng)絡(luò)時(shí)没龙,也能顯示數(shù)據(jù)
//設(shè)置緩存目錄
File cacheFile = new File(RetrofitApplication.getContext().getExternalCacheDir(), CACHE_NAME);
//生成緩存,50M
Cache cache = new Cache(cacheFile, 1024 * 1024 * 50);
//緩存攔截器
Interceptor cacheInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//網(wǎng)絡(luò)不可用
if (!NetworkUtils.isAvailable(RetrofitApplication.getContext())) {
//在請(qǐng)求頭中加入:強(qiáng)制使用緩存缎玫,不訪問網(wǎng)絡(luò)
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
}
Response response = chain.proceed(request);
//網(wǎng)絡(luò)可用
if (NetworkUtils.isAvailable(RetrofitApplication.getContext())) {
int maxAge = 0;
// 有網(wǎng)絡(luò)時(shí) 在響應(yīng)頭中加入:設(shè)置緩存超時(shí)時(shí)間0個(gè)小時(shí)
response.newBuilder()
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
} else {
// 無網(wǎng)絡(luò)時(shí)硬纤,在響應(yīng)頭中加入:設(shè)置超時(shí)為4周
int maxStale = 60 * 60 * 24 * 28;
response.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
return response;
}
};
當(dāng)網(wǎng)絡(luò)不可用的時(shí)候,強(qiáng)制使用緩存赃磨。當(dāng)網(wǎng)絡(luò)可用的時(shí)候筝家,直接訪問網(wǎng)絡(luò),即把緩存中內(nèi)容的期限設(shè)置為0邻辉。這樣瀏覽器直接認(rèn)為緩存過期溪王,走網(wǎng)絡(luò)訪問途徑腮鞍。當(dāng)網(wǎng)絡(luò)不可用的時(shí)候,把緩存中內(nèi)容的期限設(shè)置為4周在扰,即4周內(nèi)只要進(jìn)行訪問缕减,都認(rèn)為數(shù)據(jù)有效。
Cache-control 是由服務(wù)器返回的 Response 中添加的頭信息芒珠,它的目的是告訴客戶端是要從本地讀取緩存還是直接從服務(wù)器摘取消息桥狡。它有不同的值,每一個(gè)值有不同的作用皱卓。關(guān)于更多CacheControl緩存策略的了解裹芝,可以參考這篇文章。
超時(shí)娜汁、重連
超時(shí)需重連
//設(shè)置超時(shí)
builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
//錯(cuò)誤重連
builder.retryOnConnectionFailure(true);
設(shè)置Retrofit
retrofit = new Retrofit.Builder()
.baseUrl(url)
//設(shè)置 Json 轉(zhuǎn)換器
.addConverterFactory(GsonConverterFactory.create())
//RxJava 適配器
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
.build();
至此嫂易,便完成了Retrofit配置的簡(jiǎn)單配置,以上配置僅僅滿足常用的網(wǎng)絡(luò)請(qǐng)求掐禁。如果有其他要求怜械,可以在此基礎(chǔ)上進(jìn)行修改。
下面是以上配置的全部代碼的地址傅事,并進(jìn)行了簡(jiǎn)單的封裝缕允,感興趣的可以下載。
代碼地址