J'ai la méthode suivante:
public class ParentalControlInteractor {
public Single<Boolean> isPinSet() {
return bamSdk.getPinManager().isPINSet();
}
}
Je veux appeler cette fonction pour qu'elle s'exécute une fois, puis répète chaque minute jusqu'à l'infini, mais cela semble maladroit:
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());
});
N'y a-t-il pas une meilleure façon de le faire? J'utilise RxJava2. En outre, la méthode ci-dessus n'appelle que 10000 fois. Je veux l'appeler pour toujours, comme utiliser Handler.postDelayed ().
Il s'avère que cela fait le travail:
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());
});
Essaye ça:
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());
});
vous pouvez utiliser interval()
oberator voici le code
DisposableObserver<Boolean> disposable =
Observable.interval(1, TimeUnit.MINUTES)
.flatMap(new Function<Long, ObservableSource<? extends Boolean>>() {
@Override public ObservableSource<? extends Boolean> apply(@NonNull Long aLong)
throws Exception {
return isPinSet().toObservable();
}
})
.subscribeOn(Schedulers.io())
.subscribeWith(new DisposableObserver<Boolean>() {
@Override public void onNext(Boolean aBoolean) {
}
@Override public void onError(Throwable e) {
}
@Override public void onComplete() {
}
});
si vous souhaitez terminer cette opération à tout moment, appelez disposable.dispose()
Meilleure façon de répéter la demande à chaque fois avec un délai spécifique de la première émission
return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
.flatMap(aLong -> repository.repeatedRequest());
Vous pouvez combiner certains opérateurs RxJava:
Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();
J'ai trouvé cette solution très élégante et très simple