retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map
繼續上一篇之后 MonkeyLei:Retrofit2+Rxjava-Rxjava2.x-篇一-用起來 ,上篇簡單的對網絡請求做了實踐,過程對上下游線程,對線程切換,以及map/flatmap的簡單做了了解。然后對RxJava1.x和RxJava2.x的區別那些也做了了解,相關的鏈接,官方的/網友的都是小萌新忒么搬來的,O(∩_∩)O哈哈~
小萌新上一篇還想這樣:就是知識看的太少了,不知道咋整。。。
實際上,群友都告訴我說,你要么再封裝一層Observable,當然也可以用操作符map/flatmap這些來做鏈式處理!所以可能可能要糾正下之前的說法!
map看看呢!
.observeOn(Schedulers.io()) // 還可以指定一個io線程, 用map的形式進行預處理
.map(object: Function, List>{
override fun apply(t: List): List {
Log.e("observable map", "flatMap thread'name=" + Thread.currentThread().name)
return t
}
})
flatMap看看呢? -鏈表List我們可以做一些特殊,甚至是耗時處理!
.observeOn(Schedulers.io()) // 上一次請求的結果回調中,我們還是拿來在io線程中做預處理
.flatMap(object: Function, ObservableSource>>{
override fun apply(t: List): ObservableSource> {
// 這里是io線程,可以做一些耗時操作,然后返給onNext的UI線程
Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
// 原樣的給返回去
return Observable.fromArray(t);
}
})
你要注意,這種線程指定與處理的成對出現!map/flatMap處理后,之后你可以切換到UI線程:
.observeOn(AndroidSchedulers.mainThread()) // 請求都完成后,切換到UI線程,將結果進行渲染
然后就可以進行subscribe的一個訂閱,此時請求啟動!這種邏輯小萌新要注解熟悉,當然可能重要的是看人家如何設計的,思想應該更重要一些!
從上面來看,我們此時應該就可以利用flatMap再次做請求了,(返回值是Observable)。 map是不行的啦,map不能返回ObservableSource!
直接上代碼如何:
GitHubService.kt
@GET("users/{user}/repos")
fun listReposStringRxJavaObservable(@Path("user") user: String): Observable>
Main3Activity.kt
package com.hl.rxnettest
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.reactivex.Observable
import io.reactivex.ObservableSource
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.functions.Function
import io.reactivex.schedulers.Schedulers
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
class Main3Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main3)
// 老樣子,再來過一遍Retrofit請求流程
// 1. 創建Retrofit實例
var retrofit = Retrofit.Builder()
.baseUrl("https://api.github.com/")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build()
// 2. 創建一個請求服務實例
var gitHubService = retrofit.create(GitHubService::class.java)
// 3. 獲取服務對應的請求實例
var gitCall = gitHubService.listReposStringRxJavaObservable("FanChael")
// 4.1 進行基本請求 - 指定上下游所在線程
var dis = gitCall.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { t ->
//lamba表達式走起
for (item in t!!) {
// SuperStartElectronic subtitle display - 電子字幕展示-接機、演唱會、見面、展示專用.https://github.com/FanChael/SuperStart
// Log.e("observable", item.name + item.description + item.html_url)
}
}
// 4.2 有時候,我們需要連續做兩次請求,比如提交訂單成功后,然后調起支付接口(至于后續支付結果干什么,暫時不管!)
// 如果我們不采用map,flatmap等操作符來做連續請求的話,按照小萌新之前的寫法就是在第一次onNext成功回調里面,再次發起一次subscribe請求,同樣的請求代碼還會再寫一次!
// 而RxJava已經考慮到了這一點,為我們準備了更方便的操作符。這里就拿flatmap為例?
// --flatmp需要返回的是一個ObservableSource,這時候就返回上游的observable對象
// let'start
gitCall.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io()) // 由于請求結果還需要拿來再做一次網絡請求,因此我們再次放到io下線程中處理
.flatMap(object: Function, ObservableSource>>{
override fun apply(t: List): ObservableSource> {
// 在進行一次請求 - 小萌新就將就重復調用了
// TODO t可以拿來作為再次請求時的的參數
Log.e("observable apply1", t.get(0).name)
Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
return gitHubService.listReposStringRxJavaObservable("FanChael")
}
})
.observeOn(Schedulers.io()) // 上一次請求的結果回調中,我們還是拿來在io線程中做第三次請求
.flatMap(object: Function, ObservableSource>>{
override fun apply(t: List): ObservableSource> {
// 在進行一次請求 - 小萌新就將就重復調用了
// TODO t可以拿來作為再次請求時的的參數
Log.e("observable apply2", "ttt")
Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
return gitHubService.listReposStringRxJavaObservable("FanChael")
}
})
.observeOn(Schedulers.io()) // 上一次請求的結果回調中,我們還是拿來在io線程中做預處理
.flatMap(object: Function, ObservableSource>>{
override fun apply(t: List): ObservableSource> {
// 這里是io線程,可以做一些耗時操作,然后返給onNext的UI線程
Log.e("observable", "flatMap thread'name=" + Thread.currentThread().name)
// 原樣的給返回去
return Observable.fromArray(t);
}
})
.observeOn(AndroidSchedulers.mainThread()) // 請求都完成后,切換到UI線程,將結果進行渲染
.subscribe(object : Observer>{
override fun onComplete() {
}
override fun onSubscribe(d: Disposable) {
}
override fun onNext(t: List) {
Log.e("observable onNext", t[0].name)
}
override fun onError(e: Throwable) {
}
})
}
}
老樣子,依賴別忘:
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.6.0'
// 最新支持rxjava2的適配器 https://github.com/square/retrofit/tree/master/retrofit-adapters/rxjava2
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.0'
// https://github.com/ReactiveX/RxAndroid
// https://github.com/ReactiveX/RxJava
implementation "io.reactivex.rxjava2:rxjava:2.2.9"
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
結果:
06-20 14:34:43.005 8154-8161/? E/zygote64: Failed sending reply to debugger: Broken pipe
06-20 14:34:44.911 8154-8186/com.hl.rxnettest E/observable apply1: banner
06-20 14:34:44.911 8154-8186/com.hl.rxnettest E/observable: flatMap thread'name=RxCachedThreadScheduler-3
06-20 14:34:45.469 8154-8187/com.hl.rxnettest E/observable map: flatMap thread'name=RxCachedThreadScheduler-4
06-20 14:34:45.470 8154-8188/com.hl.rxnettest E/observable apply2: ttt
06-20 14:34:45.470 8154-8188/com.hl.rxnettest E/observable: flatMap thread'name=RxCachedThreadScheduler-5
06-20 14:34:46.075 8154-8189/com.hl.rxnettest E/observable: flatMap thread'name=RxCachedThreadScheduler-6
06-20 14:34:46.076 8154-8154/com.hl.rxnettest E/observable onNext: banner
這里需要注意的是, flatMap并不保證事件的順序 -如果需要保證順序則需要使用concatMap
不是搬磚,勝似搬磚! - 小萌新還是很努力的,就是努力的有點慢,努力的有點坑!
總結
以上是生活随笔為你收集整理的retrofit 会请求两次_Retrofit2+Rxjava-Rxjava2.x-篇二-依次执行多个请求-flatMap/map的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 多个监听_java中监听一个客
- 下一篇: java long 溢出_关于溢出:Ja