Rxjava2+Retrofit的完美封裝

要說(shuō)2016年最火的Android技術(shù)是什么,毫無(wú)疑問(wèn)肯定是RxJava+Retrofit+Mvp。現(xiàn)如今2017年也已經(jīng)只剩下最后一個(gè)月了。相信做android開(kāi)發(fā)的小伙伴對(duì)RxJava和Retrofit也不再陌生。即使沒(méi)有刻意的去學(xué)習(xí)過(guò)耿币,也應(yīng)該對(duì)RxJava和Retrofit有個(gè)一知半解。去年的時(shí)候?qū)W習(xí)了Rxjava和Retrofit的基本用法韧拒,但一直沒(méi)有在實(shí)際項(xiàng)目中運(yùn)用淹接。今年開(kāi)做新項(xiàng)目,果斷在新項(xiàng)目中引入了RxJava和Retrofit叛溢。本篇文章將介紹筆者在項(xiàng)目中對(duì)Retrofit的封裝塑悼。

先來(lái)看一下封裝過(guò)后的Retrofit如何使用。


沒(méi)錯(cuò)楷掉,就是這么簡(jiǎn)潔的一個(gè)鏈?zhǔn)秸{(diào)用厢蒜,可以顯示加載動(dòng)畫(huà),還加入了Retrofit生命周期的管理烹植。

開(kāi)始之前需要先在module項(xiàng)目里的Gradle文件中添加用到的依賴(lài)庫(kù)


為了方便依賴(lài)庫(kù)版本的修改我們采用”io.reactivex.rxjava2:rxjava:$rootProject.ext.rxjava2Version”這中方式添加依賴(lài)斑鸦,因此需要在project的build.gradle文件的加上以下內(nèi)容:

構(gòu)建初始化Retrofit的工具類(lèi)IdeaApi

在該類(lèi)中主要完成三個(gè)功能,即:

設(shè)置日志攔截器攔截服務(wù)器返回的json數(shù)據(jù)草雕。Retrofit將請(qǐng)求到j(luò)son數(shù)據(jù)直接轉(zhuǎn)換成了實(shí)體類(lèi)巷屿,但有時(shí)候我們需要查看json數(shù)據(jù),Retrofit并沒(méi)有提供直接獲取json數(shù)據(jù)的功能墩虹。因此我們需要自定義一個(gè)日志攔截器攔截json數(shù)據(jù)嘱巾,并輸入到控制臺(tái)。

設(shè)置 Http 攔截器诫钓,處理緩存問(wèn)題旬昭。通過(guò)攔截器攔截Http請(qǐng)求頭,為請(qǐng)求頭配置緩存信息尖坤,包括控制緩存的最大生命值稳懒,控制緩存的過(guò)期時(shí)間闲擦。

獲取Retrofit實(shí)例慢味。通過(guò)單利模式獲取Retrofit實(shí)例。

實(shí)現(xiàn)代碼如下:


服務(wù)器響應(yīng)數(shù)據(jù)的基類(lèi)BasicResponse

構(gòu)建服務(wù)器響應(yīng)數(shù)據(jù)的基類(lèi) BasicResponse墅冷。假定服務(wù)器返回的Json數(shù)據(jù)格式如下:


根據(jù)Json數(shù)據(jù)格式構(gòu)建我們的 BasicResponse(BasicResponse中的字段內(nèi)容需要根據(jù)自己服務(wù)器返回的數(shù)據(jù)確定)纯路。代碼如下:

封裝DefaultObserver處理服務(wù)器響應(yīng)

構(gòu)建DefaultObserver處理服務(wù)器響應(yīng)數(shù)據(jù)。定義DefaultObserver類(lèi)繼承Observer寞忿,并重寫(xiě)相應(yīng)的方法驰唬。

在請(qǐng)求數(shù)據(jù)過(guò)程中免不了會(huì)出現(xiàn)各種錯(cuò)誤或者異常,可以分為兩種情況:

像登錄時(shí)密碼錯(cuò)誤、請(qǐng)求參數(shù)錯(cuò)誤的情況叫编,即服務(wù)器返回了錯(cuò)誤的數(shù)據(jù)辖佣,我們可以稱(chēng)之為錯(cuò)誤。只要服務(wù)器返回?cái)?shù)據(jù)搓逾,Observer中的onNext()方法就會(huì)被執(zhí)行卷谈。但有時(shí)服務(wù)器返回錯(cuò)誤數(shù)據(jù)并不是我們想要的,因此我們需要對(duì)錯(cuò)誤數(shù)據(jù)進(jìn)行處理霞篡。我們可以和服務(wù)端事先約定正常情況的請(qǐng)求碼世蔗,如上面Json中的code等于200時(shí)視為數(shù)據(jù)正常,code不為200時(shí)視為數(shù)據(jù)錯(cuò)誤朗兵。因此我們可以定義出一個(gè)請(qǐng)求數(shù)據(jù)正常的抽象方法onSuccess()污淋,在code為200時(shí)調(diào)用,并在請(qǐng)求數(shù)據(jù)的頁(yè)面重寫(xiě)該方法余掖。另外定義一個(gè)請(qǐng)求失敗的方法onFail()寸爆,在code不為200時(shí)調(diào)用,并Toast出錯(cuò)誤原因盐欺。請(qǐng)求網(wǎng)絡(luò)頁(yè)面不必重寫(xiě)該方法而昨。代碼如下:


請(qǐng)求網(wǎng)絡(luò)時(shí)出現(xiàn)異常情況,如網(wǎng)絡(luò)連接失敗找田、網(wǎng)絡(luò)連接超時(shí)歌憨、數(shù)據(jù)解析異常等情況。我們可以稱(chēng)之為異常墩衙,即這種情況下Observer的onError()方法被調(diào)用务嫡。因此我們可以定義一個(gè)onException()的方法,并根據(jù)不同的異常在onException()方法中給出對(duì)應(yīng)的Toast提示漆改。代碼如下:


處理加載動(dòng)畫(huà)ProgressDialog

我們可以自定義ProgressBar,然后封裝成DialogUtils進(jìn)行控制ProgressDialog心铃。

DialogUtils代碼如下:


加入ProgressBar后完整的DefaultObserver,由于代碼太長(zhǎng)挫剑,有興趣的同學(xué)可以點(diǎn)擊左下方的閱讀原文進(jìn)行查看去扣。

Rxjava生命周期處理

在 Activity 或者 Fragment 中使用 RxJava 時(shí)我們有必要對(duì) RxJava 的生命周期進(jìn)行管理,否則可能引起內(nèi)存泄漏問(wèn)題樊破。在這里我們使用?RxLifecycle?來(lái)對(duì) RxJava 進(jìn)行生命周期管理愉棱。

在gradel中添加依賴(lài)如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哲戚,隨后出現(xiàn)的幾起案子奔滑,更是在濱河造成了極大的恐慌,老刑警劉巖顺少,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋其,死亡現(xiàn)場(chǎng)離奇詭異王浴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)梅猿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)氓辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人袱蚓,你說(shuō)我怎么就攤上這事筛婉。” “怎么了癞松?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵爽撒,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我响蓉,道長(zhǎng)硕勿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任枫甲,我火速辦了婚禮源武,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘想幻。我一直安慰自己粱栖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布脏毯。 她就那樣靜靜地躺著闹究,像睡著了一般。 火紅的嫁衣襯著肌膚如雪食店。 梳的紋絲不亂的頭發(fā)上渣淤,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音吉嫩,去河邊找鬼价认。 笑死,一個(gè)胖子當(dāng)著我的面吹牛自娩,可吹牛的內(nèi)容都是我干的用踩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忙迁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脐彩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起动漾,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤丁屎,失蹤者是張志新(化名)和其女友劉穎荠锭,沒(méi)想到半個(gè)月后旱眯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年删豺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了共虑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呀页,死狀恐怖妈拌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蓬蝶,我是刑警寧澤尘分,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站丸氛,受9級(jí)特大地震影響培愁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缓窜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一定续、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧禾锤,春花似錦私股、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至黄娘,卻和暖如春旦签,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寸宏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工宁炫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氮凝。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓羔巢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親罩阵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竿秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,160評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)稿壁,斷路器幽钢,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 又是一年中秋佳節(jié),祝各位中秋節(jié)快樂(lè)傅是。 今天我們來(lái)聊聊這個(gè)最近很火的網(wǎng)絡(luò)請(qǐng)求庫(kù)retrofit匪燕,在此基礎(chǔ)上會(huì)延伸出一...
    涅槃1992閱讀 7,790評(píng)論 13 133
  • 下次花開(kāi)時(shí)蕾羊, 已不相識(shí)。 歲月易流逝帽驯, 回首便是往昔龟再。 記憶被擱淺, 往事也終會(huì)消散尼变。 人生在世利凑, 終有悲歡離合,...
    沐忻閱讀 118評(píng)論 0 0
  • 關(guān)于初戀曾幾何時(shí)看過(guò)許多文章嫌术,當(dāng)時(shí)毫無(wú)感覺(jué)“С海現(xiàn)在經(jīng)歷過(guò)一些后覺(jué)得許多事真的只有自己經(jīng)歷以后才可以深刻體會(huì)到。 以前...
    為了紀(jì)念的忘卻閱讀 146評(píng)論 0 0