RxJava2 PublishSubject出现意外行为

时间:2017-06-19 15:42:47

标签: rx-java2

我有以下使用PublishSubject

的代码
val subject = PublishSubject.create<Int>()

val o1: Observable<String> =
        subject.observeOn(Schedulers.newThread()).map { i: Int ->
            println("${Thread.currentThread()} | ${Date()} | map => $i")
            i.toString()
        }

o1.subscribe {
    println("${Thread.currentThread()} | ${Date()} | direct subscription (1) => $it")
}

o1.subscribe {
    println("${Thread.currentThread()} | ${Date()} | direct subscription (2) => $it")
}

o1.subscribe {
    println("${Thread.currentThread()} | ${Date()} | direct subscription (3) => $it")
}

println("${Thread.currentThread()} | ${Date()} | submitting 1")

subject.onNext(1)

1)我从中创建了Observable并对其进行了映射(出于本示例的目的,我只是转换为String)=&gt; o1

2)然后我订阅了o1 3次。

3)最后我&#34;发布&#34;通过致电subject.onNext(1)来举办活动。

令我惊讶的是,我得到以下输出:

Thread[main,5,main] | Mon Jun 19 09:46:37 PDT 2017 | submitting 1
Thread[RxNewThreadScheduler-1,5,main] | Mon Jun 19 09:46:37 PDT 2017 | map => 1
Thread[RxNewThreadScheduler-2,5,main] | Mon Jun 19 09:46:37 PDT 2017 | map => 1
Thread[RxNewThreadScheduler-3,5,main] | Mon Jun 19 09:46:37 PDT 2017 | map => 1
Thread[RxNewThreadScheduler-1,5,main] | Mon Jun 19 09:46:37 PDT 2017 | direct subscription (1) => 1
Thread[RxNewThreadScheduler-2,5,main] | Mon Jun 19 09:46:37 PDT 2017 | direct subscription (2) => 1
Thread[RxNewThreadScheduler-3,5,main] | Mon Jun 19 09:46:37 PDT 2017 | direct subscription (3) => 1

map最终会被调用3次而且我不明白为什么因为我订阅o1这应该在map发生之后发生。我肯定错过了什么。任何帮助将不胜感激。

由于 颜

1 个答案:

答案 0 :(得分:1)

来自评论:

您订阅了o1三次,每次都会创建一个独立的序列,直到将PublishSubject发送到所有3个链的onNext

从所有3个订阅者的角度来看,PublishSubject是一个多播源,通过subscribe()调用建立的独立链向他们发送事件。

Subject上应用运算符通常不会使整个链变热,因为这些运算符元素只有在订阅时才会附加到源Subject。因此,多个订阅将产生到同一上游Subject的多个通道。

使用publish获取ConnectableObservable(或最后的另一个PublishSubject),使该序列从该点开始变热。