RxJava BehaviorSubject没有发出最后一项?

时间:2017-07-22 11:10:01

标签: java kotlin rx-java rx-java2

我有一个简单的RxJava,使用ReplaySubject,我可以得到结果,其中所有3个数字都被打印出来。

    val observable : Observable<Int> = Observable.just(1, 2, 3)
    val subject = ReplaySubject.create<Int>()
    observable.subscribe(subject)
    subject.subscribe{
        result ->
        System.out.println("Start $result in Subscription Result")
    }

当我改为行为时,我希望打印第三个数字,即3,因为我一直认为行为是重播最后一个发出的项目。

    val observable : Observable<Int> = Observable.just(1, 2, 3)
    val subject = BehaviorSubject.create<Int>()
    observable.subscribe(subject)
    subject.subscribe{
        result ->
        System.out.println("Start $result in Subscription Result")
    }

然而,它不会打印任何东西。为什么?

我在这里错过了什么重要的事吗?如果是,请告诉我如何打印假设的最后一项(即3)。

1 个答案:

答案 0 :(得分:1)

它不会打印任何内容,因为已经终止了替代。如果订阅仍处于活动状态,则将打印3,例如:

val o1: Observable<Int> = Observable.just(1, 2, 3)
val o2: Observable<Int> = Observable.just(4).delay(100,TimeUnit.MILLISECONDS)
val observable: Observable<Int> = Observable.concat(o1, o2)
val subject = BehaviorSubject.create<Int>()
observable.subscribe(subject)
subject.subscribe{
    result ->
    System.out.println("Start $result in Subscription Result")
}
Thread.sleep(1000)

将打印3和4(延迟之后),在订阅之前发布3作为最近事件,在订阅之后发出4。

此外,正如@akarnokd在评论部分ReplaySubject.createWithSize(1)中所解释的那样,即使在可观察完成后也可以用来始终重播最后一项,如果需要单项而不管流完成状态,那么可以使用observable.takeLast(1).subscribe(subject)保证:

val observable : Observable<Int> = Observable.just(1, 2, 3)
val subject = ReplaySubject.createWithSize<Int>(1)
observable.takeLast(1).subscribe(subject) //can be moved after subject.subscribe as well
subject.subscribe{
    result ->
    System.out.println("Start $result in Subscription Result")
}