Home » Android » android – Best way to repeat an observable every minute rxjava

android – Best way to repeat an observable every minute rxjava

Posted by: admin June 15, 2020 Leave a comment

Questions:

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

How to&Answers:

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

Answer:

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

Answer:

Try
.repeatWhen(objectFlowable -> Flowable.timer(10, TimeUnit.SECONDS).repeat())

Answer:

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

Answer:

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

Answer:

You can combine some RxJava operators:

Observable.wrap(parentalControlInteractor.isPinSet().delay(1,TimeUnit.MINUTES)).repeat();

I found this solution very elegant and very simple