如何在 GATT 错误的情况下重试 RxAndroidBLE 发现服务。

How to Retry RxAndroidBLE Discover Services in case of GATT error.

我正在使用 RxAndroidBLE 库在我的 GATT 服务器中发现服务。 它大部分时间都工作正常,但我经常收到 GATT 错误 133 (0x85),但它失败了。我想在一段时间内重试几次以发现服务,比如 5 秒。 这是我正在尝试的代码

bleDevice = mBleClient.getBleDevice(macAddress);
    subscription =  bleDevice.establishConnection(false)
            .flatMap(RxBleConnection::discoverServices)
            .first() // Disconnect automatically after discovery
            .observeOn(AndroidSchedulers.mainThread())
            .doOnUnsubscribe(this::onUnsubscribe)
            .compose(this.bindToLifecycle())
            .retryWhen(errors -> errors.flatMap(error -> {
                        if (isGattError(error) {
                            return Observable.just(new Object());
                        } else {
                            return Observable.error(error);
                        }
                    }
            ))
            .timeout(5, TimeUnit.SECONDS)
            .subscribe(this::getScanResult, this::onConnectionFailure);

它不工作,看起来 retryWhen 没有被调用。这可能更多是 rxJava 问题,但我将非常感谢对此的任何帮助。

正如您在评论中所写,您的 this::onUnsubscribe 正在调用 subscription.unsubscribe(),因此 .retryWhen() 运算符不可能被调用。

您可以将 .doOnUnsubscribe() 移动到 .retryWhen() 下方,或者反过来移动以获得预期的行为。