每分钟 rxjava 重复一个可观察对象的最佳方法
Best way to repeat an observable every minute rxjava
我有以下方法:
public class ParentalControlInteractor {
public Single<Boolean> isPinSet() {
return bamSdk.getPinManager().isPINSet();
}
}
我想将此函数调用到 运行 一次,然后每分钟重复一次直到无穷大,但这看起来很笨拙:
parentalControlInteractor.isPinSet()
.subscribeOn(Schedulers.io())
.repeat(10000)
.timeout(1600,TimeUnit.MILLISECONDS)
.doOnError(throwable -> {
Timber.e(throwable,"Error getting if Pin is set");
throwable.printStackTrace();
})
.subscribe(isPinSet -> {
this.isPinSet = isPinSet;
Timber.d("Pin is set = " + isPinSet.toString());
});
没有更好的方法吗?我正在使用 RxJava2。另外,上面的方法只调用了 10000 次。我想永远称呼它,就像使用 Handler.postDelayed().
试试这个:
parentalControlInteractor.isPinSet()
.subscribeOn(Schedulers.io())
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> observable) {
return observable.delay(60, TimeUnit.SECONDS);
}
})
.doOnError(throwable -> {
Timber.e(throwable,"Error getting if Pin is set");
throwable.printStackTrace();
})
.subscribe(isPinSet -> {
this.isPinSet = isPinSet;
Timber.d("Pin is set = " + isPinSet.toString());
});
事实证明这是在做这项工作:
parentalControlInteractor.isPinSet()
.subscribeOn(Schedulers.io())
.delay(10000,TimeUnit.MILLISECONDS)
.repeat()
.doOnError(throwable -> {
Timber.e(throwable,"Error getting if Pin is set");
throwable.printStackTrace();
})
.subscribe(isPinSet -> {
this.isPinSet = isPinSet;
Timber.d("Pin is set = " + isPinSet.toString());
});
你可以使用interval()
oberator 这里是代码
DisposableObserver<Boolean> disposable =
Observable.interval(1, TimeUnit.MINUTES)
.flatMap(aLong -> isPinSet().toObservable())
.subscribeOn(Schedulers.io())
.subscribeWith({isPinSet -> doSomething()}, {throwable -> handleError()}, {});
如果您想随时完成此操作,请调用 disposable.dispose()
您可以组合一些 RxJava 运算符:
Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();
我发现这个解决方案非常优雅且非常简单
每次使用特定的首次发射延迟重复请求的最佳方式
return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
.flatMap(aLong -> repository.repeatedRequest());
试试看
.repeatWhen(objectFlowable -> Flowable.timer(10, TimeUnit.SECONDS).repeat())
我有以下方法:
public class ParentalControlInteractor {
public Single<Boolean> isPinSet() {
return bamSdk.getPinManager().isPINSet();
}
}
我想将此函数调用到 运行 一次,然后每分钟重复一次直到无穷大,但这看起来很笨拙:
parentalControlInteractor.isPinSet()
.subscribeOn(Schedulers.io())
.repeat(10000)
.timeout(1600,TimeUnit.MILLISECONDS)
.doOnError(throwable -> {
Timber.e(throwable,"Error getting if Pin is set");
throwable.printStackTrace();
})
.subscribe(isPinSet -> {
this.isPinSet = isPinSet;
Timber.d("Pin is set = " + isPinSet.toString());
});
没有更好的方法吗?我正在使用 RxJava2。另外,上面的方法只调用了 10000 次。我想永远称呼它,就像使用 Handler.postDelayed().
试试这个:
parentalControlInteractor.isPinSet()
.subscribeOn(Schedulers.io())
.repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
@Override
public Observable<?> call(Observable<? extends Void> observable) {
return observable.delay(60, TimeUnit.SECONDS);
}
})
.doOnError(throwable -> {
Timber.e(throwable,"Error getting if Pin is set");
throwable.printStackTrace();
})
.subscribe(isPinSet -> {
this.isPinSet = isPinSet;
Timber.d("Pin is set = " + isPinSet.toString());
});
事实证明这是在做这项工作:
parentalControlInteractor.isPinSet()
.subscribeOn(Schedulers.io())
.delay(10000,TimeUnit.MILLISECONDS)
.repeat()
.doOnError(throwable -> {
Timber.e(throwable,"Error getting if Pin is set");
throwable.printStackTrace();
})
.subscribe(isPinSet -> {
this.isPinSet = isPinSet;
Timber.d("Pin is set = " + isPinSet.toString());
});
你可以使用interval()
oberator 这里是代码
DisposableObserver<Boolean> disposable =
Observable.interval(1, TimeUnit.MINUTES)
.flatMap(aLong -> isPinSet().toObservable())
.subscribeOn(Schedulers.io())
.subscribeWith({isPinSet -> doSomething()}, {throwable -> handleError()}, {});
如果您想随时完成此操作,请调用 disposable.dispose()
您可以组合一些 RxJava 运算符:
Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();
我发现这个解决方案非常优雅且非常简单
每次使用特定的首次发射延迟重复请求的最佳方式
return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
.flatMap(aLong -> repository.repeatedRequest());
试试看
.repeatWhen(objectFlowable -> Flowable.timer(10, TimeUnit.SECONDS).repeat())