如何在GATT错误的情况下重试RxAndroidBLE发现服务。
我正在使用RxAndroidBLE库来发现我的GATT服务器中的服务。 它大部分时间都能正常工作,但通常我得到GATT错误133(0x85),并且失败。我想重试发现一段时间的服务时间,比如说5秒。 这里是我想如何在GATT错误的情况下重试RxAndroidBLE发现服务。
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()
运算符不可能被调用。
您可以移动.retryWhen()
下面的.doOnUnsubscribe()
或其他方式来获得预期的行为。
谢谢Dariusz,我有你的另一个小问题,我们可以尝试retryWhen方法connectionObservable以及?我在准备Connection Observable时也面临同样的问题(错误133)。 – Avijeet
是的,'RxBleDevice.establishConnection()'已经可以使用'.retryWhen()'。 '.retryWhen()'唯一的问题是当它用在从'RxBleConnection'获得的'Observable's并且连接本身将被断开连接时 - 那些重试时的可观察对象将返回断开异常。需要建立一个新的连接。 –
您是否有我们可以处理异常并重试连接的示例。我一直在观察,有些时候垃圾收集会导致BLE gatt断开连接,然后我的代码一直在等待连接并从我的设备中读取。 – Avijeet
你好@Avijeet - 你确定连接和服务发现将在5秒内成功完成吗? –
我观察到的是,当它工作时,服务发现只需要一两秒钟。 5秒的时间间隔可以更改,主要问题是如何重试。 – Avijeet
你在'.onUnsubscribe()'中做了什么? –