RxJava + Retrofit完成網路請求
前言
本文基於RxJava、Retrofit的使用,若是對RxJava或Retrofit還不瞭解的簡友可以先了解RxJava、Retrofit的用法再來看這篇文章。
在這片文章之前分別單獨介紹過Rxjava以及Retrofit的使用:
Android Retrofit 2.0 的使用
Android RxJava的使用(一)基本用法
(以及後面的幾篇,就不一一列出了)
使用
在瞭解了RxJava和Retrofit分別的用法後,RxJava、Retrofit的搭配使用也就不再話下了。
先看看使用Retrofit完成一次網路請求是怎樣的
-
單獨使用Retrofit
1、先寫一個serviceinterface MyService { @GET("user/login" ) Call<UserInfo> login( @Query("username") String username, @Query("password") String password ); }
2、獲取Call執行網路請求
Retrofit retrofit = new Retrofit.Builder() .addConverterFactory(GsonConverterFactory.create()) .baseUrl(BASE_URL) .build(); MyService service = retrofit.create(MyService.class); Call<UserInfo> call = service.login("1111", "ssss"); call.enqueue(new Callback<UserInfo>() { @Override public void onResponse(Call<UserInfo> call, Response<UserInfo> response) { //請求成功操作 } @Override public void onFailure(Call<UserInfo> call, Throwable t) { //請求失敗操作 } });
以上是Retrofit單獨使用時的做法。那Retrofit與RxJava結合是怎樣使用的?下面就來說說這篇文章的重點。
-
RxJava + Retrofit完成網路請求
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、寫一個登入的serviceinterface MyService { @GET("user/login" ) Observable<UserInfo> login( @Query("username") String username, @Query("password") String password ); }
相比之前的service,這裡getNews方法的返回值是Observable型別。Observable...是不是覺得很熟悉,這貨不就是之前在RxJava使用到的被監聽者?
3、使用Observable完成一個網路請求,登入成功後儲存資料到本地。Retrofit retrofit = new Retrofit.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())//請求在新的執行緒中執行 .observeOn(Schedulers.io()) //請求完成後在io執行緒中執行 .doOnNext(new Action1<UserInfo>() { @Override public void call(UserInfo userInfo) { saveUserInfo(userInfo);//儲存使用者資訊到本地 } }) .observeOn(AndroidSchedulers.mainThread())//最後在主執行緒中執行 .subscribe(new Subscriber<UserInfo>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { //請求失敗 } @Override public void onNext(UserInfo userInfo) { //請求成功 } });
RxJava + Retrofit 形式的時候,Retrofit 把請求封裝進 Observable ,在請求結束後呼叫 onNext() 或在請求失敗後呼叫 onError()。
可以看到,呼叫了service的login方法後得到Observable物件,在新的執行緒中執行網路請求,請求成功後切換到io執行緒執行儲存使用者資訊的動作,最後再切換到主執行緒執行請求失敗onError()、請求成功onNext()。整體的邏輯十分清晰都在一條鏈中,就算還有別的要求還可以往裡面新增,絲毫不影響程式碼的簡潔。(終於舉了一個有實際意義的例子)注意:retrofit的初始化加了一行程式碼
addCallAdapterFactory(RxJavaCallAdapterFactory.create())
-
RxJava + Retrofit 進階
在上面舉到登入後儲存使用者資訊的例子,其實在做專案的時候,往往在登入後得到的並不是使用者資訊。一般登入後會得到token,然後根據token去獲取使用者的資訊。他們的步驟是這樣的:
1、登入
2、獲取使用者資訊(前提:登入成功)
可以看得出來,這是一個巢狀的結構...巢狀啊!!!天吶,最怕巢狀的結構了。
使用RxJava + Retrofit來完成這樣的請求(借用拋物線的例子,稍微做了點改動)//登入,獲取token @GET("/login") public Observable<String> login( @Query("username") String username, @Query("password") String password); //根據token獲取使用者資訊 @GET("/user") public Observable<User> getUser( @Query("token") String token); //.................................. service.login("11111", "22222") .flatMap(new Func1<String, Observable<User>>() { //得到token後獲取使用者資訊 @Override public Observable<User> onNext(String token) { return service.getUser(token); }) .subscribeOn(Schedulers.newThread())//請求在新的執行緒中執行請求 .observeOn(Schedulers.io()) //請求完成後在io執行緒中執行 .doOnNext(new Action1<User>() { //儲存使用者資訊到本地 @Override public void call(User userInfo) { saveUserInfo(userInfo); } }) .observeOn(AndroidSchedulers.mainThread())//在主執行緒中執行 .subscribe(new Observer<User>() { @Override public void onNext(User user) { //完成一次完整的登入請求 userView.setUser(user); } @Override public void onCompleted() { } @Override public void onError(Throwable error) { //請求失敗 } });
通過一個flatMap()輕鬆完成一次巢狀的請求,而且邏輯十分清晰。so easy~~~
小結
RxJava的實用性從上面的兩個例子慢慢體現了出來,邏輯越是複雜,RxJava的優勢就越明顯。RxJava的使用就暫時介紹到這裡吧,使用過程中遇到好用的再出來跟大家分享。
以上有錯誤之處感謝指出
相關文章
- OkHttp、rxJava、Retrofit聯合網路請求(一)HTTPRxJava
- OkHttp、rxJava、Retrofit聯合網路請求(二)HTTPRxJava
- 使用Retrofit+RxJava實現網路請求RxJava
- RxJava+Retrofit+Gson實現網路請求RxJava
- Retrofit+okhttp+Rxjava封裝網路請求工具類HTTPRxJava封裝
- 分分鐘使用Retrofit+Rxjava實現網路請求RxJava
- Android RxJava2+Retrofit2搭建網路請求框架AndroidRxJava框架
- Android網路請求(終) 網路請求框架RetrofitAndroid框架
- Retrofit+Rxjava的資料請求RxJava
- Retrofit + RxJava + OkHttp 讓網路請求變的簡單-基礎篇RxJavaHTTP
- Retrofit + RxJava + OkHttp 讓網路請求變的簡單-封裝篇RxJavaHTTP封裝
- Retrofit網路請求原始碼解析原始碼
- 使用retrofit進行網路請求
- Android使用Kotlin+Retrofit+Rxjava實現簡單的網路請求AndroidKotlinRxJava
- Retrofit原始碼解析之網路請求原始碼
- 基於RxJava2+Retrofit+RxCache的網路請求封裝 | 掘金技術徵文RxJava封裝
- RxJava+Retrofit2搭建網路請求元件完整配置、示例程式碼及流程梳理RxJava元件
- retrofit網路請求框架的地址及方法地址框架
- 輕鬆搞定Retrofit不同網路請求方式的請求引數配置,Retrofit常用註解的使用
- 網路請求框架之Retrofit2.0基本講解框架
- Kotlin中Retrofit網路請求簡單封裝Kotlin封裝
- Retrofit2/Rxkotlin網路請求的封裝Kotlin封裝
- Retrofit2.5怎麼做到網路請求的處理的?
- 輕鬆搞定Retrofit不同網路請求方式的請求引數配置,及常用註解使用
- Android RxJava+Retrofit完美封裝(快取,請求,生命週期管理)AndroidRxJava封裝快取
- Retrofit+Rxjava網路層的優雅封裝RxJava封裝
- Retrofit + RxJavaRxJava
- Kotlin + 協程 + Retrofit + MVVM優雅的實現網路請求KotlinMVVM
- Retrofit + Kotlin + MVVM 的網路請求框架的封裝嘗試KotlinMVVM框架封裝
- Android網路請求(3) 網路請求框架OkHttpAndroid框架HTTP
- Android中用Kotlin Coroutine(協程)和Retrofit進行網路請求和取消請求AndroidKotlin
- Android小知識-剖析Retrofit中網路請求的兩種方式Android
- Android網路請求(4) 網路請求框架VolleyAndroid框架
- 原始碼分析Retrofit請求流程原始碼
- 網路請求了
- 網路請求優化之取消請求優化
- 網路元件 基於Retrofit2+RxJava2+GSON/Fastjson的網路框架元件RxJavaASTJSON框架
- 使用RxJava快取Rest請求RxJava快取REST