gpt4 book ai didi

android - 将 timeout() 与 retryWhen() 结合使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:41:27 25 4
gpt4 key购买 nike

我正在创建一个简单的应用程序,用于使用 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));
}

最佳答案

retryWhen 运算符通过重新订阅其上方的运算符链来工作。由于您将 timeout 放在它之前,因此会重新订阅所述超时,从而再次从头开始计数。

timeout放在 retryWhen 之后应该将全局超时应用于整个可重试流程。

关于android - 将 timeout() 与 retryWhen() 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43766810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com