[英]“More produced than requested” exception when using `replay` and `autoConnect`
我想創建一個可觀察值,僅當新值與先前值不同時才從基礎熱可觀察值(從-1
開始)發出值。 另外,我希望將最新價值立即發送給新訂戶。 我想出了以下代碼:
PublishSubject<Integer> hotObservable = PublishSubject.create();
Observable<Integer> observable = hotObservable
.startWith(-1)
.distinctUntilChanged()
.replay(1)
.autoConnect(0);
然而后第一個值(總是失敗-1
,不管是什么hotObservable
發出訂閱之前observable
)發射到新的用戶與java.lang.IllegalStateException: more produced than requested
有趣的是,當我不自動連接,手動卻訂閱:
Observable<Integer> observable = hotObservable
.startWith(-1)
.distinctUntilChanged()
.replay(1)
.autoConnect();
observable.subscribe().unsubscribe();
以下訂閱者正常工作,接收最后一個值,然后更新。
我無法讓replay(1).autoConnect(0)
正常工作,我感覺好像錯過了一些事情-為什么要訂閱和取消訂閱工作,而autoConnect(0)
卻不能呢? 創建這種可觀察的正確方法是什么?
除非我使用autoConnect(); observable.subscribe().unsubscribe()
否則此測試方法將失敗autoConnect(); observable.subscribe().unsubscribe()
autoConnect(); observable.subscribe().unsubscribe()
:
Observable<Integer> observable = hotObservable
.startWith(-1)
.distinctUntilChanged()
.replay(1)
.autoConnect(); // With (0) it fails
observable.subscribe().unsubscribe(); // Needed if we don't auto connnect
hotObservable.onNext(1);
hotObservable.onNext(2);
hotObservable.onNext(3); // I want this value to be received by new subscriber
TestSubscriber<Integer> subscriber = TestSubscriber.create();
observable.subscribe(subscriber);
subscriber.assertNoErrors();
subscriber.assertValues(3);
在以上RxJava 1.1.3上的代碼中,我沒有得到More produced than requested
錯誤。
斷言失敗的原因是,在任何訂閱者實際請求之前, replay
不會向上游請求任何內容。 如果TestSubscriber
是第一個訂閱的用戶,它將觸發startWith發出-1,然后切換到PublishSubject,它不保留任何值,因此您什么也不會收到。
我相信您正在尋找的是BehaviorSubject
,它保留了最后一個值,並從新訂戶的值開始:
BehaviorSubject<Integer> hotObservable = BehaviorSubject.create(-1);
Observable<Integer> observable = hotObservable.distinctUntilChanged();
hotObservable.onNext(1);
hotObservable.onNext(2);
hotObservable.onNext(3);
TestSubscriber<Integer> subscriber = TestSubscriber.create();
observable.subscribe(subscriber);
subscriber.assertNoErrors();
subscriber.assertValue(3);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.