11

私は次のホットオブザーバブルを持っています:

hotObservable = Observable.interval(0L, 1L, TimeUnit.SECONDS)
                          .map((t) -> getCurrentTimeInMillis()))

しかし、私はそれを止める良い方法を見つけることができません。フラグ ( )を使用takeWhileして、これを部分的に解決できました。booleanrunTimer

Observable.interval(0L, 1L, TimeUnit.SECONDS)
          .takeWhile((t) -> runTimer)
          .map((t) -> getCurrentTimeInMillis()))

ただし、このアプローチには気に入らない点が 2 つあります。

  1. フラグを維持する必要がありrunTimerますが、これは望ましくありません。
  2. runTimerなるfalseと、Observable は単純に完了します。つまり、もう一度出力したい場合は、新しい Observable を作成する必要があります。私はそれをしたくありません。もう一度開始するように指示するまで、Observable にアイテムの発行を停止させたいだけです。

私は次のようなことを望んでいました:

hotObservable.stop();
hotObservable.resume();

そうすれば、フラグを保持する必要がなく、オブザーバブルは常に生きています (ただし、イベントを発行していない可能性があります)。

どうすればこれを達成できますか?

4

2 に答える 2

9

可能なアプローチの 1 つは、BehaviorSubject と switchMap を使用します。

BehaviorSubject<Boolean> subject = BehaviorSubject.create(true);
hotObservable = subject.distinctUntilChanged().switchMap((on) -> {
    if (on) {
        return Observable.interval(0L, 1L, TimeUnit.SECONDS);
    } else {
        return Observable.never();
    }
}).map((t) -> getCurrentTimeInMillis());

サブジェクトにブール値を送信することにより、オブザーバブルの出力を制御できます。subject.onNext(true)そのサブジェクトを使用して作成されたオブザーバブルが値の放出を開始します。subject.onNext(false)そのフローを無効にします。

switchMap、スイッチがオフになったときに、基になるオブザーバブルを破棄します。distinctUntilChangedまた、不要な切り替えを行わないようにするためにも使用されます。

于 2016-12-10T02:55:53.633 に答える
1

これなら使えるかも

Observable.interval(3, TimeUnit.SECONDS)
        .takeUntil(stop)
        .subscribe(new MyObserver());

Thread.sleep(10000);
stop.onNext(-1);
于 2017-06-11T05:02:11.287 に答える