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)系作者
  • 序言:七十年代末蹭越,一起剝皮案震驚了整個(gè)濱河市障本,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌响鹃,老刑警劉巖驾霜,帶你破解...
    沈念sama閱讀 212,332評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異买置,居然都是意外死亡粪糙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,508評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門忿项,熙熙樓的掌柜王于貴愁眉苦臉地迎上來猜旬,“玉大人,你說我怎么就攤上這事倦卖。” “怎么了椿争?”我有些...
    開封第一講書人閱讀 157,812評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵怕膛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我秦踪,道長(zhǎng)褐捻,這世上最難降的妖魔是什么掸茅? 我笑而不...
    開封第一講書人閱讀 56,607評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮柠逞,結(jié)果婚禮上昧狮,老公的妹妹穿的比我還像新娘。我一直安慰自己板壮,他們只是感情好逗鸣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,728評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绰精,像睡著了一般撒璧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笨使,一...
    開封第一講書人閱讀 49,919評(píng)論 1 290
  • 那天卿樱,我揣著相機(jī)與錄音,去河邊找鬼硫椰。 笑死繁调,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靶草。 我是一名探鬼主播蹄胰,決...
    沈念sama閱讀 39,071評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼爱致!你這毒婦竟也來了烤送?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,802評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤糠悯,失蹤者是張志新(化名)和其女友劉穎帮坚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體互艾,經(jīng)...
    沈念sama閱讀 44,256評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡试和,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,576評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纫普。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅悍。...
    茶點(diǎn)故事閱讀 38,712評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖昨稼,靈堂內(nèi)的尸體忽然破棺而出节视,到底是詐尸還是另有隱情,我是刑警寧澤假栓,帶...
    沈念sama閱讀 34,389評(píng)論 4 332
  • 正文 年R本政府宣布寻行,位于F島的核電站,受9級(jí)特大地震影響匾荆,放射性物質(zhì)發(fā)生泄漏拌蜘。R本人自食惡果不足惜杆烁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,032評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望简卧。 院中可真熱鬧兔魂,春花似錦、人聲如沸举娩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晓铆。三九已至勺良,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骄噪,已是汗流浹背尚困。 一陣腳步聲響...
    開封第一講書人閱讀 32,026評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留链蕊,地道東北人事甜。 一個(gè)月前我還...
    沈念sama閱讀 46,473評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滔韵,于是被迫代替她去往敵國(guó)和親逻谦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,606評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容