簡體   English   中英

RxJava:動態的可觀察集合

[英]RxJava: Dynamic set of observables

我有一個中央班級,叫做Central 它可以添加1-N個可觀察物。 這些我需要動態添加,然后知道何時執行最后的onComplete()。

這個怎么做?

代碼示例:

public class Central {
  public void addObservable(Observable o){
    // Add the new observable to subscriptions
  }
}

更新。

我已經花了一段時間了。 使用@DaveMoten的答案,我已經接近了。

這是我的方法,可隨意添加一個新的Observable,並在所有這些Observable完成時得到通知(偽代碼):

class central {
  PublishSubject<Observable<T>> subject = PublishSubject.create();
  int commandCount = 0;
  int concatCount = 0;
  addObservable(Observable newObs){
    commandCount++;
    concatCount++;
    subject.concatMap(o -> 
          o.doOnCompleted(
                  () -> { 
                    concatCount--;
                    LOG.warn("inner completed, concatCount: " + concatCount);
                  })
          ).doOnNext(System.out::println)
            .doOnCompleted(() -> { 
                System.out.println("OUTER completed");
            } ) .subscribe();

    onNext(newObs);
    subject.onCompleted(); // If this is here, it ends prematurely (after first onComplete)
    // if its not, OUTER onComplete never happens

    newObs.subscribe((e) ->{},
    (error) -> {},
    () -> {
        commandCount--;
        LOG.warn("inner end: commandCount: " + commandCount);
    });
  }
}
// ... somewhere else in the app:
Observable ob1 = Observable.just(t1);
addObservable.addObservable(ob1);
// ... and possibly somewhere else:
Observable ob2 = Observable.just(t2, t3);
addObservable(ob2);

// Now, possibly somewhere else:
ob1.onNext(1);
// Another place:
ob2.onNext(2);

日志記錄如下所示:

19:51:16.248 [main] WARN  execute: commandCount: 1
19:51:17.340 [main] WARN  execute: commandCount: 2
19:51:23.290 [main] WARN  execute: commandCount: 3
9:51:26.969 [main] WARN   inner completed, concatCount: 2
19:51:27.004 [main] WARN  inner end: commandCount: 2
19:51:27.008 [main] WARN  inner completed, concatCount: 1
19:51:27.009 [main] WARN  inner end: commandCount: 1
19:51:51.745 [ProcessIoCompletion0] WARN  inner completed, concatCount: 0
19:51:51.750 [ProcessIoCompletion0] WARN  inner completed, concatCount: -1
19:51:51.751 [ProcessIoCompletion0] WARN  inner end: commandCount: 0
19:51:51.752 [ProcessIoCompletion0] WARN  inner completed, concatCount: -2
19:51:51.753 [ProcessIoCompletion0] WARN  inner completed, concatCount: -3

更新:我添加了一些計數器,這些計數器表明我不了解concatMap發生了什么。 您可以看到觀察者本身的lambda訂閱數正確地遞減為0,但是concatMap oncomplete降至-3! 而且OUTER完全不會發生。

使用PublishSubject

PublishSubject<Observable<T>> subject = 
    PublishSubject.create();
subject
    // protect against concurrent calls to subject (optional)
    .serialize()
    .concatMap(o -> 
      o.doOnCompleted(() -> System.out.println("inner completed")))
    .doOnNext(System.out::println)
    .doOnCompleted(() -> System.out.println("completed"))
    .subscribe(subscriber);

subject.onNext(Observable.just(t1));
subject.onNext(Observable.just(t2, t3));
subject.onCompleted();

  .

暫無
暫無

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

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