每分钟rxjava重复一次观察的最佳方法

问题描述 投票:6回答:6

我有以下方法:

public class ParentalControlInteractor {
   public Single<Boolean> isPinSet() {
       return bamSdk.getPinManager().isPINSet();
   }
}

我想调用此函数运行一次,然后每分钟重复一次,直到无穷大但这看起来很笨拙:

    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()一样。

android rx-java2 repeating
6个回答
4
投票

试试这个:

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
投票

你可以使用interval() oberator这里是代码

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

              }
            });

如果你想在任何时候完成这个操作,请致电disposable.dispose()


2
投票

事实证明这是在做这项工作:

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
投票

每次重复请求的最佳方式,具有特定的第一次发射延迟

 return Observable.interval(FIRST_ITEM_DELAY, CYCLE_TIME, TimeUnit.SECONDS)
                       .flatMap(aLong -> repository.repeatedRequest());

0
投票

您可以组合一些RxJava运算符:

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

我发现这个解决方案非常优雅而且非常简单


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.