如何在不重新订购的情况下用Flowable替换另一个

时间:2019-11-22 08:27:42

标签: java rx-java2

我具有返回Flowable函数的接口

interface Iface{
   Flowable<Int> get();
}

现在让我们假设具体的实现是:

class IFaceImpl{
  int noOfSecs = 1;
  Flowable<Int> get(){
    return Flowable.interval(noOfSecs,TimeUnit.SECONDS)
  }
}

我希望能够以这种方式更改noOfSecs参数,即Flowable.interval将每2s而不是1s产生一次事件。当客户可以重新订阅时,这将很容易。就我而言,我无法做到这一点,我希望客户端仅订阅一次,但能够更改Flowable的发射频率以进行更改。

做这样的事情的最好方法是什么?

1 个答案:

答案 0 :(得分:3)

使用switchMap动态停止上一个间隔并开始一个新间隔。

class IfaceImpl {
    final Subject<Long> nextInterval = 
        BehaviorSubject.createDefault(1)
        .toSerialized();

    Flowable<Long> get() {
        return nextInterval.switchMap(seconds -> 
            Flowable.interval(seconds, TimeUnit.SECONDS)
        );
    }

    void setNumberOfSeconds(int seconds) {
        nextInterval.onNext(seconds);
    }
}