有没有办法在运行时更改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");
}
});
我试图谷歌找到解决方案,但不幸的是我找不到任何一个,如果有的话我需要帮助或资源。
答案 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
中找到完整的解决方案我希望这很有用!