我正在创建一个简单的应用程序,用于使用 RxAndroidBle 库连接蓝牙设备(干杯,大家干得好!)。
我遇到的情况是,有时当我连接到设备时,我会收到状态为 133 的 Gatt 错误。
我知道这可能会发生,所以我想做的就是在发生错误时重试所有操作。
这不是问题,我可以轻松做到这一点retryWhen()
运算符,但是我有另一个要求 - 流必须在之后终止
如果连接不成功则需要 30 秒。我用了timeout()
为此,但问题是当我重试时,计时器会再次启动。
所以问题是如何将 timeout() 运算符与 retryWhen() 结合起来,以便我可以重试某些特定错误,但保持计数器继续运行。
我有一些关于组合可观察量的想法,或者一些单独的可观察量,它们将在超时后检查连接状态,但我
想知道我是否可以在单个可观察中做到这一点。
到目前为止我的代码如下所示:
public Observable<ConnectingViewState> connectToDevice(String macAddress) {
final RxBleDevice rxBleDevice = rxBleClient.getBleDevice(macAddress);
return rxBleDevice.establishConnection(false)
.subscribeOn(Schedulers.io())
.map(rxBleConnection -> new ConnectingViewState.ConnectedViewState(rxBleConnection))
.cast(ConnectingViewState.class)
.timeout(40, TimeUnit.SECONDS)
.startWith(new ConnectingViewState.ConnectingInProgressViewState())
.retryWhen(errors -> errors.flatMap(error -> {
if (isDefaultGattError(error)) {
return Observable.just(new Object());
} else {
return Observable.error(error);
}
}
))
.onErrorReturn(throwable -> new ConnectingViewState.ErrorState(throwable));
}
The retryWhen
运算符通过重新订阅其上方的运算符链来工作。自从您放置了您的timeout
在它之前,所述超时被重新订阅,因此再次从头开始计数。
放置timeout
after the retryWhen
应该对整个可重试流程应用全局超时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)