2016-11-09 199 views
1

我想實現一項功能,其中BLE掃描激活10秒,然後中斷10秒,並在視圖處於活動狀態時重複。爲BLE掃描連續訂閱和取消訂閱Observable

我使用的是RxAndroidBle,它包裝了Android BLE API的反應性。我有一個方法scanForRange(getConnectAddress());它使用Observable<RxBleScanResult>和一些過濾器和應用的地圖返回一個簡單的Observable<Integer>。要開始掃描,必須簡單地訂閱此可觀察項,然後取消訂閱停止掃描。

我首先想到的是使用Observable.interval(),如下圖所示:

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

我會從訂閱我的onPause()然後退訂。現在這不起作用,因爲一旦發射第一個時間間隔,掃描就會被訂閱,並將持續發出結果(而不是每10秒發送一次)。

那麼實現此功能的最佳方式是什麼?我認爲我可以用Observable和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