CombineLatest的subscriptionOn是否有作用?

时间:2019-02-15 08:13:49

标签: rx-java

subscribeOn()之后添加Observable.combineLatest()像这样有什么意义:

Observable.combineLatest(
  someObservable,
  theOtherObservable,
  (something, theOther) -> iAmFunction(something, theOther)))
  .subscribeOn(Schedulers.computation())
  ...

我所理解的iAmFunction()会在最后被组合-可观察到的调度程序上调用。

那末subscribeOn()的目的是什么?

2 个答案:

答案 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更改了combineLatestsubscribe的线程。如果您不使用observeOn,则可能会从emitting itemssubscribe生效。

答案 1 :(得分:0)

subscribeOn指定订阅的副作用将在何处发生,并且不能保证您在其使用的线程上得到项目。请改用observeOn

Observable.combineLatest(
    someObservable.observeOn(Schedulers.single()),
    theOtherObservable.observeOn(Schedulers.single()),
    (something, theOther) -> iAmFunction(something, theOther))
)

combineLatest在订阅时要做的是订阅其源,因此,您在someObservable调度程序线程上可传递地订阅了theOtherObservablecomputation()。但是请注意,如果someObservable没有放弃控制,则theOtherObservable将不会被订阅。始终最好将subscribeOn指定为尽可能靠近源:

Observable.combineLatest(
    someObservable.subscribeOn(Schedulers.computation()),
    theOtherObservable.subscribeOn(Schedulers.computation()),
    (something, theOther) -> iAmFunction(something, theOther))
)