簡體   English   中英

RxJava 手動發出項目

[英]RxJava emit items manually

我是 RxJava 世界的新手。 我幾天前就開始了,我正在嘗試做一些非常具體的事情。

我想使用 RxJava 將一些事件從一個類傳遞到其他類。 我的發射器類做了一些工作,完成后我想將該事件通知給每個訂閱的類。

另外,我不想丟失任何事件,所以如果發射器完成一個動作並通知訂閱者但沒有人使用該事件,它應該保留它。

我一直在尋找主題,因為我讀到的是按需發射的好方法,但我找不到解決我的問題的方法,也許我可以按照他們在該鏈接中所說的方式嘗試PublishSubject

請注意,PublishSubject 可能會在創建后立即開始發出項目(除非您已采取措施防止這種情況發生),因此存在在創建主題和觀察者訂閱它之間可能丟失一個或多個項目的風險。 如果您需要保證從源 Observable 交付所有項目,則需要使用 Create 形成該 Observable,以便您可以手動重新引入“冷” Observable 行為(在開始發出項目之前檢查所有觀察者是否已訂閱) ),或者改用 ReplaySubject。

目前我有一個Observable ,它向每個新訂閱發出完整的事件列表:

protected List<T> commands = new ArrayList<>();
Observable<T> observe = Observable.defer(() -> Observable.fromIterable(commands));

Disposable subscribe(Consumer<T> onNext, Consumer<Throwable> onError) {
    return observe.subscribe(onNext/*, onError*/);
}

但這與我想要的相差甚遠。 正如我所說,我對 Rx 非常菜鳥,如果我找不到一種方法,我最終將使用ReplaySubject (完整的命令列表將在每次訂閱時重復,但至少我永遠不會丟失一個事件)。

編輯:

最后我把我的問題分成兩部分。 對於手動發出項目,我使用PublishSubject

PublishSubject<T> actionSubject = PublishSubject.create();
actionSubject.subscribe(onceAction);
actionSubject.onNext(action);

您可能正在尋找一個BehaviorSubject ,它重播為每個新訂閱者發出的最后一個值。

無論如何,您可以使用名為createWithSize(capacity)的工廠方法創建ReplaySubject來定義大小有界緩沖區,該緩沖區在溢出時丟棄最舊的項目。 還有一種方法可以創建具有類似行為的限時緩沖區。

這不是你要找的嗎?

    Observable<Integer> observable = Observable.create((ObservableEmitter<Integer> e) -> {
        for (int i = 0; i < 10; i++) {
            e.onNext(i);
        }
        e.onComplete();
    });

    System.out.println("FIRST");
    observable
            .doOnComplete(() -> System.out.println("FIRST COMPLETE"))
            .subscribe(System.out::println);
    System.out.println("SECOND");
    observable
            .doOnComplete(() -> System.out.println("SECOND COMPLETE"))
            .subscribe(System.out::println);

輸出:

FIRST
0
1
2
3
4
5
6
7
8
9
FIRST COMPLETE
SECOND
0
1
2
3
4
5
6
7
8
9
SECOND COMPLETE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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