我有一个简单的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)。
答案 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")
}