Retrofit配置詳解及封裝,讓你的網(wǎng)絡(luò)請(qǐng)求更簡(jiǎn)單

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)單的封裝,感興趣的可以下載。
代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容