要說(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)如下: