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