问题
I have the following method:
public class ParentalControlInteractor {
public Single<Boolean> isPinSet() {
return bamSdk.getPinManager().isPINSet();
}
}
I want to call this function to run once, then repeat every minute until infinity but this seems clumsy:
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());
});
Isn't there a better way to do it? I'm using RxJava2. Also, the method above only calls it 10000 times. I want to call it forever, like using Handler.postDelayed().
回答1:
you can use interval()
oberator here is the code
DisposableObserver<Boolean> disposable =
Observable.interval(1, TimeUnit.MINUTES)
.flatMap(aLong -> isPinSet().toObservable())
.subscribeOn(Schedulers.io())
.subscribeWith({isPinSet -> doSomething()}, {throwable -> handleError()}, {});
if you want to finish this operation at any time call disposable.dispose()
回答2:
Try this:
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());
});
回答3:
It turns out this is doing the job:
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());
});
回答4:
Best way to repeat request every time with specific delay of first emission
return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
.flatMap(aLong -> repository.repeatedRequest());
回答5:
Try
.repeatWhen(objectFlowable -> Flowable.timer(10, TimeUnit.SECONDS).repeat())
回答6:
You can combine some RxJava operators:
Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();
I found this solution very elegant and very simple
来源:https://stackoverflow.com/questions/45376253/best-way-to-repeat-an-observable-every-minute-rxjava