RxJava + Retrofit
前言
本文基于RxJava、Retrofit的使用,若是對RxJava或Retrofit還不了解的簡友可以先了解RxJava、Retrofit的用法再來看這篇文章。
在這片文章之前分別單獨(dú)介紹過Rxjava以及Retrofit的使用:
(以及后面的幾篇,就不一一列出了)
使用
在了解了RxJava和Retrofit分別的用法后,RxJava、Retrofit的搭配使用也就不再話下了。
先看看使用Retrofit完成一次網(wǎng)絡(luò)請求是怎樣的
單獨(dú)使用Retrofit
1、先寫一個service
interfaceMyService{@GET("user/login")Calllogin(? ? ? ? ? @Query("username")String username,? ? ? ? ? @Query("password")String password? );}
2、獲取Call執(zhí)行網(wǎng)絡(luò)請求
Retrofit retrofit =newRetrofit.Builder()? ? ? ? ? ? ? .addConverterFactory(GsonConverterFactory.create())? ? ? ? ? ? ? .baseUrl(BASE_URL)? ? ? ? ? ? ? .build();? ? ? MyService service = retrofit.create(MyService.class);? ? ? Call call = service.login("1111","ssss");? ? ? call.enqueue(newCallback() {@OverridepublicvoidonResponse(Call call, Response response){//請求成功操作}@OverridepublicvoidonFailure(Call call, Throwable t){//請求失敗操作}? ? ? });
以上是Retrofit單獨(dú)使用時的做法。那Retrofit與RxJava結(jié)合是怎樣使用的?下面就來說說這篇文章的重點。
RxJava + Retrofit完成網(wǎng)絡(luò)請求
1、添加依賴。前四個分別是RxJava、RxAndroid、Retrofit以及Gson的庫,最后那個才是新加入的,RxJava + Retrofit的使用需要用到最后那個包。
compile'io.reactivex:rxjava:x.y.z'compile'io.reactivex:rxandroid:1.0.1'compile'com.squareup.retrofit2:retrofit:2.0.2'compile'com.squareup.retrofit2:converter-gson:2.0.2'compile'com.squareup.retrofit2:adapter-rxjava:2.0.2'
注意:最后三個包的版本號必須一樣,這里用的是2.0.2。
2、寫一個登錄的service
interfaceMyService{@GET("user/login")Observablelogin(? ? ? ? ? @Query("username")String username,? ? ? ? ? @Query("password")String password? );}
相比之前的service,這里getNews方法的返回值是Observable類型。Observable...是不是覺得很熟悉,這貨不就是之前在RxJava使用到的被監(jiān)聽者?
3、使用Observable完成一個網(wǎng)絡(luò)請求,登錄成功后保存數(shù)據(jù)到本地。
Retrofit retrofit =newRetrofit.Builder()? ? ? ? ? ? .addConverterFactory(GsonConverterFactory.create())? ? ? ? ? ? .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新的配置.baseUrl(BASE_URL)? ? ? ? ? ? .build();? ? ? MyService service = retrofit.create(MyService.class);? ? ? service.login(phone, password)//獲取Observable對象.subscribeOn(Schedulers.newThread())//請求在新的線程中執(zhí)行.observeOn(Schedulers.io())//請求完成后在io線程中執(zhí)行.doOnNext(newAction1() {@Overridepublicvoidcall(UserInfo userInfo){? ? ? ? ? ? ? ? ? ? ? saveUserInfo(userInfo);//保存用戶信息到本地}? ? ? ? ? ? ? })? ? ? ? ? ? ? .observeOn(AndroidSchedulers.mainThread())//最后在主線程中執(zhí)行.subscribe(newSubscriber() {@OverridepublicvoidonCompleted(){? ? ? ? ? ? ? ? ? }@OverridepublicvoidonError(Throwable e){//請求失敗}@OverridepublicvoidonNext(UserInfo userInfo){//請求成功}? ? ? ? ? ? ? });
RxJava + Retrofit 形式的時候,Retrofit 把請求封裝進(jìn) Observable ,在請求結(jié)束后調(diào)用 onNext() 或在請求失敗后調(diào)用 onError()。
可以看到,調(diào)用了service的login方法后得到Observable對象,在新的線程中執(zhí)行網(wǎng)絡(luò)請求,請求成功后切換到io線程執(zhí)行保存用戶信息的動作,最后再切換到主線程執(zhí)行請求失敗onError()、請求成功onNext()。整體的邏輯十分清晰都在一條鏈中,就算還有別的要求還可以往里面添加,絲毫不影響代碼的簡潔。(終于舉了一個有實際意義的例子)
注意:retrofit的初始化加了一行代碼
addCallAdapterFactory(RxJavaCallAdapterFactory.create())
RxJava + Retrofit 進(jìn)階
在上面舉到登錄后保存用戶信息的例子,其實在做項目的時候,往往在登錄后得到的并不是用戶信息。一般登錄后會得到token,然后根據(jù)token去獲取用戶的信息。他們的步驟是這樣的:
1、登錄
2、獲取用戶信息(前提:登錄成功)
可以看得出來,這是一個嵌套的結(jié)構(gòu)...嵌套?。。?!天吶,最怕嵌套的結(jié)構(gòu)了。
使用RxJava + Retrofit來完成這樣的請求(借用拋物線的例子,稍微做了點改動)
//登錄,獲取token@GET("/login")publicObservablelogin(? ? @Query("username")String username,? @Query("password")String password);//根據(jù)token獲取用戶信息@GET("/user")publicObservablegetUser(? @Query("token")String token);//..................................service.login("11111","22222")? .flatMap(newFunc1>() {//得到token后獲取用戶信息@OverridepublicObservableonNext(String token){returnservice.getUser(token);? ? ? })? .subscribeOn(Schedulers.newThread())//請求在新的線程中執(zhí)行請求.observeOn(Schedulers.io())//請求完成后在io線程中執(zhí)行.doOnNext(newAction1() {//保存用戶信息到本地@Overridepublicvoidcall(User userInfo){? ? ? ? ? saveUserInfo(userInfo);? ? ? }? })? .observeOn(AndroidSchedulers.mainThread())//在主線程中執(zhí)行.subscribe(newObserver() {@OverridepublicvoidonNext(User user){//完成一次完整的登錄請求userView.setUser(user);? ? ? }@OverridepublicvoidonCompleted(){? ? ? }@OverridepublicvoidonError(Throwable error){//請求失敗}? });
通過一個flatMap()輕松完成一次嵌套的請求,而且邏輯十分清晰。so easy~~~
小結(jié)
RxJava的實用性從上面的兩個例子慢慢體現(xiàn)了出來,邏輯越是復(fù)雜,RxJava的優(yōu)勢就越明顯。RxJava的使用就暫時介紹到這里吧,使用過程中遇到好用的再出來跟大家分享。
以上有錯誤之處感謝指出
參考:給 Android 開發(fā)者的 RxJava 詳解
(本文部分內(nèi)容引用自該博客)
作者:帶心情去旅行
鏈接:http://www.lxweimin.com/p/1fb294ec7e3b
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。