如何在 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()
下方,或者反过来移动以获得预期的行为。
我正在使用 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()
下方,或者反过来移动以获得预期的行为。