Rx java 订阅CombineTest有什么作用吗?
将Rx java 订阅CombineTest有什么作用吗?,rx-java,Rx Java,将subscribeOn()添加到Observable.CombineTest()之后有什么意义吗 Observable.combineLatest( someObservable, theOtherObservable, (something, theOther) -> iAmFunction(something, theOther))) .subscribeOn(Schedulers.computation()) ... 我所理解的iAmFunction()将在组
subscribeOn()
添加到Observable.CombineTest()
之后有什么意义吗
Observable.combineLatest(
someObservable,
theOtherObservable,
(something, theOther) -> iAmFunction(something, theOther)))
.subscribeOn(Schedulers.computation())
...
我所理解的iAmFunction()
将在组合为最后一个的任何调度器上调用
那么最后的
subscribeOn()
的目的是什么呢?在这个问题中,subscribeOn
决定哪个线程执行iAmFunction()
()。基本上,subscribeOn
SubscribeOn操作符指定可观察对象将在哪个线程上开始操作,无论在操作符链中的哪个点调用该操作符
例如,有两个组合测试逻辑
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)
}
如您所见,
subscribeOn
更改了combinelatetest
和subscribe
的线程。如果不使用observeOn
,它可能会从发出项目
到订阅
subscribeOn
指定订阅副作用将发生的位置,并且不保证您在它使用的线程上获得项目。改用observeOn
:
Observable.combinelatetest(
someObservable.observeOn(Schedulers.single()),
theOtherObservable.observeOn(Schedulers.single()),
(某物,其他)->我的功能(某物,其他))
)
订阅时,CombineTest
所做的是订阅其源,因此您可以在Computiation()
调度程序线程上临时订阅someObservable
和OtherObservable
。但是,请注意,如果someObservable
没有返回控制权,那么将不会订阅另一个可观察的。最好尽可能靠近源指定subscribeOn
:
Observable.combinelatetest(
someObservable.subscribeOn(Schedulers.computation()),
theOtherObservable.subscribeOn(Schedulers.computation()),
(某物,其他)->我的功能(某物,其他))
)
如何解释CachedThreadScheduler/ComputationThreadPool?这是不正确的subscribeOn
指定订阅副作用将发生的位置,并且不保证您在它使用的线程上获得项目。
Without subscribeOn
in combineLatest: main
in subscribe: main
With subscribeOn
in combineLatest: RxCachedThreadScheduler-1
in subscribe: RxComputationThreadPool-1