连续订阅和取消订阅 Observable 以进行 BLE 扫描
Continuously subscribing and unsubscribing from Observable for BLE scans
我想实现一个 BLE 扫描激活 10 秒,然后中断 10 秒,并在视图处于活动状态时重复的功能。
我正在使用 RxAndroidBle
,它包装了 Android BLE API 以实现反应性。我有一个方法 scanForRange(getConnectAddress());
,它使用 Observable<RxBleScanResult>
和一些过滤器以及应用于 return 的地图,一个简单的 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 秒发送一次 start/stop)。
那么实现此功能的最佳方式是什么?我想我可能可以将它与 Observables 和 Handlers 混合使用,但这似乎是错误的。
您可以使用 TakeUntil
和 RepeatWhen
运算符来完成此操作
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
...
我想实现一个 BLE 扫描激活 10 秒,然后中断 10 秒,并在视图处于活动状态时重复的功能。
我正在使用 RxAndroidBle
,它包装了 Android BLE API 以实现反应性。我有一个方法 scanForRange(getConnectAddress());
,它使用 Observable<RxBleScanResult>
和一些过滤器以及应用于 return 的地图,一个简单的 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 秒发送一次 start/stop)。
那么实现此功能的最佳方式是什么?我想我可能可以将它与 Observables 和 Handlers 混合使用,但这似乎是错误的。
您可以使用 TakeUntil
和 RepeatWhen
运算符来完成此操作
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
...