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混合在一起,但這似乎是錯誤的。
這似乎是按預期工作做到這一點。謝謝!我會標記你的答案是正確的。 – Orbit