2016-11-09 3 views
1

BLEスキャンが10秒間アクティブ化されてから10秒間中断され、ビューがアクティブな間に繰り返される機能を実装したいと考えています。ObservableからBLEスキャンを定期的に購読および登録解除する

私は反応性のためにAndroid BLE APIをラップするRxAndroidBleを使用しています。私は方法scanForRange(getConnectAddress());Observable<RxBleScanResult>を使用していくつかのフィルタとマップを適用して、単純なObservable<Integer>を返します。スキャンを開始するには、このオブザーバブルを購読してから購読を停止してスキャンを停止する必要があります。私はその後、私のonPause()にそのサブスクリプションからの退会う

@Override 
protected void onResume() { 
    super.onResume(); 

    mRangeScanSubscription = Observable.interval(10000, TimeUnit.MILLISECONDS) 
      .flatMap(new Func1<Long, Observable<Integer>>() { 
       @Override 
       public Observable<Integer> call(Long aLong) { 
        return scanForRange(getConnectAddress()); 
       } 
      }) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnError(new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        Log.d(TAG, "onResume() error"); 
        throwable.printStackTrace(); 
       } 
      }) 
      .subscribe(new Action1<Integer>() { 
       @Override 
       public void call(Integer integer) { 
        Toast.makeText(DeviceDetailActivity.this, "Range: " + integer, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
} 

:以下に示すように

私が最初に考えたのはObservable.interval()を使用していました。最初の間隔が出されると、スキャンがサブスクライブされ、10秒ごとの開始/停止の代わりに結果を連続して送信するため、これは機能しません。

この機能を実装するにはどうすればよいでしょうか? ObservablesとHandlersが混在していると思われるかもしれないが、それは間違っているようだ。

答えて

2

あなたはこれが期待通りに動作しているようだTakeUntilRepeatWhenオペレーター

 mRangeScanSubscription = scanForRange(getConnectAddress()) 
      .takeUntil(Observable.timer(10, TimeUnit.SECONDS)) //emits items for 10 seconds 
      .repeatWhen(completed -> completed.delay(10, TimeUnit.SECONDS)) //resubscribes after 10 seconds 
      ... 
+0

を使用してこれを行うことができます。ありがとう!私はあなたの答えを正しいものとしてマークします。 – Orbit

関連する問題