Я создаю простое приложение для подключения к устройствам Bluetooth, используя библиотеку RxAndroidBle (ура, ребята, за отличную работу!). Что я испытываю, так это то, что иногда, когда я подключаюсь к устройству, я получаю ошибку Gatt со статусом 133. Я знаю, что это может произойти, поэтому я хочу повторить все, когда возникает эта ошибка. Это не проблема, я могу легко сделать это с помощью оператора 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));
}