私は次の方法があります:
public class ParentalControlInteractor {
public Single<Boolean> isPinSet() {
return bamSdk.getPinManager().isPINSet();
}
}
この関数を呼び出して1回実行した後、毎分無限大になるまで繰り返したいのですが、これは扱いにくいようです。
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())
.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()
を呼び出します。
これを試して:
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());
});
.repeatWhen(objectFlowable -> Flowable.timer(10, TimeUnit.SECONDS).repeat())
をお試しください
最初のエミッションの特定の遅延で毎回リクエストを繰り返す最良の方法
return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
.flatMap(aLong -> repository.repeatedRequest());
いくつかのRxJavaオペレーターを組み合わせることができます。
Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();
このソリューションは非常にエレガントで非常にシンプルであることがわかりました