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

时间:2017-09-21 02:10:28

标签: 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");
                        }
                    });

我试图谷歌找到解决方案,但不幸的是我找不到任何一个,如果有的话我需要帮助或资源。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

我不是100%肯定你的意思是“我必须在运行时停止,恢复,休息和更改时间段。” 但是您可以在运行时使用新周期处理订阅并重新启动observable:

    Disposable d = Observable.interval(1, TimeUnit.SECONDS)
            .subscribeOn(Schedulers.single())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {

                }
            });
    d.dispose();    

答案 2 :(得分:1)

这是我处理问题的解决方案

private PublishSubject<Long> newInterval;

// reactive programming using RXJava2
private void prepareObserver() {
    newInterval = PublishSubject.create();

    newInterval.switchMap(currentPeriod ->
            Observable.interval(currentPeriod, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.single())
    )
            .doOnNext(v -> runOnUiThread(this::pagerForeword))
            .subscribe();

    newInterval.onNext(period);
}

并重置我调用的间隔期

newInterval.onNext(period);

您可以在以下资源教程here

中找到完整的解决方案

我希望这很有用!