在subscribeOn()
之后添加Observable.combineLatest()
像这样有什么意义:
Observable.combineLatest(
someObservable,
theOtherObservable,
(something, theOther) -> iAmFunction(something, theOther)))
.subscribeOn(Schedulers.computation())
...
我所理解的iAmFunction()
会在最后被组合-可观察到的调度程序上调用。
那末subscribeOn()
的目的是什么?
答案 0 :(得分:0)
在此问题中,subscribeOn
决定which thread executes the iAmFunction()
(Link)。基本上subscribeOn
决定发射线程。
SubscribeOn运算符指定Observable将在哪个线程上开始操作,无论该运算符在运算符链中的哪个点被调用。
例如,有两种CombineLatest逻辑。
fun main(args: Array<String>) {
Observables.combineLatest(
Observable.just("o1"),
Observable.just("o2")
) { _, _ -> Thread.currentThread().name }
.subscribe {
println("Without subscribeOn")
println("in combineLatest: $it")
println("in subscribe: ${Thread.currentThread().name}")
}
println()
Observables.combineLatest(
Observable.just("o1"),
Observable.just("o2")
) { _, _ -> Thread.currentThread().name }
.subscribeOn(Schedulers.io())
.subscribe {
println("With subscribeOn")
println("in combineLatest: $it")
println("in subscribe: ${Thread.currentThread().name}")
}
Thread.sleep(500)
}
Without subscribeOn
in combineLatest: main
in subscribe: main
With subscribeOn
in combineLatest: RxCachedThreadScheduler-1
in subscribe: RxComputationThreadPool-1
您可以看到subscribeOn
更改了combineLatest
和subscribe
的线程。如果您不使用observeOn
,则可能会从emitting items
到subscribe
生效。
答案 1 :(得分:0)
subscribeOn
指定订阅的副作用将在何处发生,并且不能保证您在其使用的线程上得到项目。请改用observeOn
:
Observable.combineLatest(
someObservable.observeOn(Schedulers.single()),
theOtherObservable.observeOn(Schedulers.single()),
(something, theOther) -> iAmFunction(something, theOther))
)
combineLatest
在订阅时要做的是订阅其源,因此,您在someObservable
调度程序线程上可传递地订阅了theOtherObservable
和computation()
。但是请注意,如果someObservable
没有放弃控制,则theOtherObservable
将不会被订阅。始终最好将subscribeOn
指定为尽可能靠近源:
Observable.combineLatest(
someObservable.subscribeOn(Schedulers.computation()),
theOtherObservable.subscribeOn(Schedulers.computation()),
(something, theOther) -> iAmFunction(something, theOther))
)