2017-07-28 50 views
1

我有以下方法:最好的方法重複可觀察到的每一分鐘rxjava

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

+0

只需調用'repeat()'不傳遞任何參數就可以永久重複 – bbsimon

+0

我不希望它每秒鐘都會調用它,我希望有一段時間間隔。 –

回答

0

事實證明,這是做的工作:

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

試試這個:

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

我收到一個異常。 –

+0

我不確定@KristyWelsh引用了什麼異常,但這種方法似乎工作正常。 – mdelolmo

0

您可以使用此​​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()