java - 连续订阅和取消订阅 Observable 以进行 BLE 扫描

标签 java android rx-java rx-android rxandroidble

我想实现一个 BLE 扫描激活 10 秒,然后中断 10 秒,并在 View 处于 Activity 状态时重复的功能。

我正在使用 RxAndroidBle它包装了 Android BLE API 以实现 react 性。我有一个方法 scanForRange(getConnectAddress());它使用 Observable<RxBleScanResult>和一些过滤器和 map 应用返回一个简单的 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 秒开始/停止一次)。

那么实现此功能的最佳方式是什么?我假设我可能可以将它与 Observables 和 Handlers 的组合一起破解,但这似乎是错误的。

最佳答案

您可以使用 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
            ...

关于java - 连续订阅和取消订阅 Observable 以进行 BLE 扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40517689/

相关文章:

java - 如何生成源代码来创建我正在调试的对象?

java - 查找单词中第一个元音出现的位置

java - 如何在 Java.String 类上添加方法

android - 线程运行中的处理程序

java - 具有共同偏好的不当行为

java - 隔离链表中的偶数和奇数节点

android - 为什么没有任何东西显示出此 flutter 支架的主体?

error-handling - RxAndroid-使用Zip运算符处理错误

rx-java - Rxjava中的“背压”一词是什么意思?

java - 取消订阅时清除资源