要說2016年最火的Android技術是什么,毫無疑問肯定是RxJava+Retrofit+Mvp?,F(xiàn)如今2017年也已經(jīng)只剩下最后一個月了。相信做android開發(fā)的小伙伴對RxJava和Retrofit也不再陌生。即使沒有刻意的去學習過,也應該對RxJava和Retrofit有個一知半解。去年的時候學習了Rxjava和Retrofit的基本用法,但一直沒有在實際項目中運用。今年開做新項目,果斷在新項目中引入了RxJava和Retrofit。本篇文章將介紹筆者在項目中對Retrofit的封裝。
先來看一下封裝過后的Retrofit如何使用。

沒錯,就是這么簡潔的一個鏈式調(diào)用,可以顯示加載動畫,還加入了Retrofit生命周期的管理。
開始之前需要先在module項目里的Gradle文件中添加用到的依賴庫

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

構建初始化Retrofit的工具類IdeaApi
在該類中主要完成三個功能,即:
設置日志攔截器攔截服務器返回的json數(shù)據(jù)。Retrofit將請求到json數(shù)據(jù)直接轉換成了實體類,但有時候我們需要查看json數(shù)據(jù),Retrofit并沒有提供直接獲取json數(shù)據(jù)的功能。因此我們需要自定義一個日志攔截器攔截json數(shù)據(jù),并輸入到控制臺。
設置 Http 攔截器,處理緩存問題。通過攔截器攔截Http請求頭,為請求頭配置緩存信息,包括控制緩存的最大生命值,控制緩存的過期時間。
獲取Retrofit實例。通過單利模式獲取Retrofit實例。
實現(xiàn)代碼如下:


服務器響應數(shù)據(jù)的基類BasicResponse
構建服務器響應數(shù)據(jù)的基類 BasicResponse。假定服務器返回的Json數(shù)據(jù)格式如下:

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

封裝DefaultObserver處理服務器響應
構建DefaultObserver處理服務器響應數(shù)據(jù)。定義DefaultObserver類繼承Observer,并重寫相應的方法。
在請求數(shù)據(jù)過程中免不了會出現(xiàn)各種錯誤或者異常,可以分為兩種情況:
像登錄時密碼錯誤、請求參數(shù)錯誤的情況,即服務器返回了錯誤的數(shù)據(jù),我們可以稱之為錯誤。只要服務器返回數(shù)據(jù),Observer中的onNext()方法就會被執(zhí)行。但有時服務器返回錯誤數(shù)據(jù)并不是我們想要的,因此我們需要對錯誤數(shù)據(jù)進行處理。我們可以和服務端事先約定正常情況的請求碼,如上面Json中的code等于200時視為數(shù)據(jù)正常,code不為200時視為數(shù)據(jù)錯誤。因此我們可以定義出一個請求數(shù)據(jù)正常的抽象方法onSuccess(),在code為200時調(diào)用,并在請求數(shù)據(jù)的頁面重寫該方法。另外定義一個請求失敗的方法onFail(),在code不為200時調(diào)用,并Toast出錯誤原因。請求網(wǎng)絡頁面不必重寫該方法。代碼如下:

請求網(wǎng)絡時出現(xiàn)異常情況,如網(wǎng)絡連接失敗、網(wǎng)絡連接超時、數(shù)據(jù)解析異常等情況。我們可以稱之為異常,即這種情況下Observer的onError()方法被調(diào)用。因此我們可以定義一個onException()的方法,并根據(jù)不同的異常在onException()方法中給出對應的Toast提示。代碼如下:

處理加載動畫ProgressDialog
我們可以自定義ProgressBar,然后封裝成DialogUtils進行控制ProgressDialog。
DialogUtils代碼如下:

加入ProgressBar后完整的DefaultObserver,由于代碼太長,有興趣的同學可以點擊左下方的閱讀原文進行查看。
Rxjava生命周期處理
在 Activity 或者 Fragment 中使用 RxJava 時我們有必要對 RxJava 的生命周期進行管理,否則可能引起內(nèi)存泄漏問題。在這里我們使用?RxLifecycle?來對 RxJava 進行生命周期管理。
在gradel中添加依賴如下:
