簡體   English   中英

使用`replay`和`autoConnect`時出現“超出要求的產量”異常

[英]“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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM