RxJava BehaviorSubject 没有发出最后一项?
RxJava BehaviorSubject not emitting last item?
我有一个简单的 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")
}
当我更改为 Behavior 时,我希望打印第三个数字,即 3,因为我一直认为 Behavior 是重播最后发出的项目。
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)。
它不打印任何东西,因为订阅已经终止。如果订阅仍然有效,那么将打印 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")
}
我有一个简单的 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")
}
当我更改为 Behavior 时,我希望打印第三个数字,即 3,因为我一直认为 Behavior 是重播最后发出的项目。
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)。
它不打印任何东西,因为订阅已经终止。如果订阅仍然有效,那么将打印 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")
}