web-dev-qa-db-ja.com

毎分rxjavaでオブザーバブルを繰り返す最良の方法

私は次の方法があります:

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()を使用するように、それを永遠に呼び出したいです。

8
Kristy Welsh

これは仕事をしていることがわかります:

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

interval() oberatorを使用できます。ここにコードがあります

_DisposableObserver<Boolean> disposable = 
Observable.interval(1, TimeUnit.MINUTES)
            .flatMap(aLong -> isPinSet().toObservable())
            .subscribeOn(Schedulers.io())
            .subscribeWith({isPinSet -> doSomething()}, {throwable -> handleError()}, {});
_

この操作をいつでも終了したい場合は、disposable.dispose()を呼び出します。

10
Mohamed Ibrahim

これを試して:

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

.repeatWhen(objectFlowable -> Flowable.timer(10, TimeUnit.SECONDS).repeat())をお試しください

5
vadimqa08

最初のエミッションの特定の遅延で毎回リクエストを繰り返す最良の方法

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

いくつかのRxJavaオペレーターを組み合わせることができます。

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

このソリューションは非常にエレガントで非常にシンプルであることがわかりました

0