创建 Observable.timer 后如何更改计时器的间隔?

How to change the interval of timer after Observable.timer created?

我想更改从 api 返回的间隔值。

我试过在订阅中重新创建计时器(和订阅)。但它不起作用。(因为它需要递归订阅...)

所以我使用 member 作为区间值。有用。但它看起来不像 Rx 风格。

// default interval. it is member
int mInterval = 10;

int initialDelay = 5;
int period = 1;
Observable.timer(initialDelay, period, TimeUnit.SECONDS)
        .filter(time_sec -> time_sec % mInterval == 0)
        .flatMap(time_sec -> getIntervalSecFromApi())
        .subscribe(new_interval_sec -> {
            // do something
            Log.d("timer_log", "end:do something");

            // I want to recreate timer using new_interval_sec. but I have no idea...
            // so I used member for interval value.
            mInterval = new_interval_sec;
        });

最好的方法是什么?


编辑

我将代码更改为 Rx 样式。

BehaviorSubject<Integer> timerSubject = BehaviorSubject.create(initialDelay);

timerSubject
        .switchMap(interval -> Observable.timer(interval, interval, TimeUnit.SECONDS))
        .flatMap(time_sec -> getIntervalSecFromApi())
        .subscribe(new_interval_sec -> {
            // do something
            Log.d("timer_log", "end:do something:" + new_interval_sec);

            timerSubject.onNext(new_interval_sec);
        });

对此的 Rx 解决方案是将您不断变化的时间间隔视为它们自己的可观察值。如果您需要从外部调用者提供值,请使用主题。

然后您可以使用 switchMap 将变化的值映射到 timer,这将在下一个计时器启动时自动终止前一个计时器。