現在網絡上面鋪天蓋地都是RxJava+Retrofit2的博客,還有好多大神不斷地造輪子。然後在前段時間,由於項目的空檔期,我就對自己現在負責的項目嘗試了一下這RxJava+Retrofit2的寫法,對於我來說,首先是大量地看各位大神的博客,從中不斷吸取精華,在結合自己公司的後臺完成的一套屬於自己項目的一套網絡請求。下面我只針對我的項目情況來描述我的理解。
1.Retrofit介紹
2.Gradle配置
3.簡單使用Retrofit2+RxJava
4.自定義JSON解析、錯誤請求處理、攔截器、降低代碼冗餘。
- Retrofit介紹
Retrofit是SQUARE美國一家移動支付公司最近新發布的在Android平臺上http訪問的開源項目,Retrofit與okhttp共同出自於Square公司,我們在HttpClient被棄用後,在HttpURLConnection使用的期間,大家想必會發現okHttp的網絡請求開源項目,然後在網絡拼命搜okHttp的二次封裝,然而retrofit對okhttp做了一層封裝,把網絡請求都交給給了Okhttp,我們只需要通過簡單的配置就能使用retrofit來進行網絡請求了。
- Gradle配置
首先我們在Gradle文件中進行配置
然而對於RxJava和Retrofit的版本差異我就不詳細描述,有興趣的同學可以逐一去學習。
簡單使用Retrofit2+RxJava
- 創建Retrofit2請求工具類
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("url")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
2. 定義請求API
@FormUrlEncoded
@POST(URLs.Login)
Observable<LoginBean> login(@FieldMap() Map<String, String> maps);
3. 簡單使用
RetrofitManage.getInstance().getHttpServiceConnection().login(maps)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<LoginBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(LoginBean loginBean) {
}
});
上面的是最簡單的Retrofit2+RxJava的用法,對於還處於認知階段的同學可以參考一下,但是對於已經有一定了解的同學,上面說的可能一點用處都沒有,下面我們纔是本篇的重點。在Retrofit2+RxJava使用過程中,我們結合項目,其實會遇到很多不同的問題,我們應該如何再次優化、再次封裝。
如何適應不同的項目不同業務
- 代碼過多重複
重複的RxJava處理,我們可以封裝一個方法統一使用RxJava來處理。
另外大家都可以看到我們每一次的請求,你需要多次重複的寫回調處理,我們需要再次優化。
最終效果
我們不用每一次的請求去寫大量重複的代碼,這樣給人一種較爲整潔的感覺。
- 我的後臺返回數據各種奇葩、原始數據嵌套多層、某情況需前端特殊處理返回數據等等(過多不吐槽),我們不能順利使用GsonConverterFactory來轉化我們需要的JavaBean,於是我們定義一個適用的JsonConverterFactory。
RetrofitManage爲:
JsonConverterFactory爲:
JsonResponseBodyConverter爲:
這樣我們可以將我們請求到的數據流轉成JSONObject對象,然後再根據自己需要解析數據組裝JavaBean。
- 如何處理錯誤請求和異常數據
在上面的JSON截取處理中,大家可以看到我對非正常返回(小於0)的情況會拋出一個ResultException的自定義異常,然後轉到Subscriber的onError中處理,還有我們在請求數據,會遇到各種錯誤的網絡請求結果,我們可以在封裝的ProgressSubscriber類中統一來處理。
ResultException類爲:
ProgressSubscriber中onError()統一處理錯誤結果
- 攔截器
對於我們的請求,okHttp還有很多的特點,例如請求攔截器header,動態注入cookie,加入https請求信任等等處理。這裏我來簡單說一下攔截器。
我們是在初始化RetrofitManage處理OkHttpClient:
總結:
上述就是我在使用RxJava+Retrofit2的時候遇到的問題,我根據自身需要來封裝網絡請求,大家在網上各種各樣的博客中都會找到適合自己的一種方式,但是我們沒有必要如何完美封裝如何完美使用這那框架的,第三方的庫會幫我們封裝底層的一些代碼,避免我們做重複多餘易出錯的事情,讓我們專注於業務邏輯,所以學習任何一個第三方庫都將是簡單的,不應該複雜不該複雜的地方。
源碼將會在下篇的RxJava+Retrofit2+MVP博客一起上傳。謝謝大家。