如何更改Observable.interval的周期,以及如何在运行时停止和恢复Observable滴答

Amj*_*ari 0 android rx-android rx-java2

有没有办法在运行时更改Observable.interval周期?有没有一种方法可以停止和恢复Observable.interval节拍?有没有办法重置间隔时间?

实际上,我正在使用以下代码在一段时间内永远执行某项操作,但是在运行期间我无法对其进行控制,因此必须在运行时停止,恢复,休息和更改周期。

Observable.interval(8, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Long>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            Log.i("TAG", "onSubscribe");
                        }

                        @Override
                        public void onNext(Long aLong) {
                            myMethod();
                        }

                        @Override
                        public void onError(Throwable e) {
                            Log.i("TAG", "onError");
                        }

                        @Override
                        public void onComplete() {
                            Log.i("TAG", "onComplete");
                        }
                    });
Run Code Online (Sandbox Code Playgroud)

我尝试用Google搜索它以找到一种解决方案,但不幸的是我没有找到任何解决方案,如果有的话,我需要帮助或资源。

aka*_*okd 5

如@DDH所示,也许最简单的方法是取消正在进行的间隔并完全开始新的流程。

但是,如果由于某种原因必须将链保持在间隔以下,则可以通过switchMap运算符切换到新的间隔PublishSubject,例如,由触发:

PublishSubject<Long> newInterval = PublishSubject.create();

newInterval.switchMap(currentPeriod ->
    Observable.interval(currentPeriod, TimeUnit.MILLISECONDS)
)
.doOnNext(v -> { /* background work */ })
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* ... */);

newInterval.onNext(1000L);

// sometime later

newInterval.onNext(200L);
Run Code Online (Sandbox Code Playgroud)