web-dev-qa-db-fra.com

Meilleure façon de répéter un observable chaque minute

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 ().

5
Kristy Welsh

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());
                });
1
Kristy Welsh

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());
        });
4
user6681036

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()

3
Mohamed Ibrahim

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());
1
Andrew Evtukhov

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

0