Не лучший способ сознательно закрыть соединение в `onNext` из `installConnection`, и если соединение потеряно, возникают только ошибки.

В том случае, если я пишу характеристику, которая перезагрузит устройство, я попаду в мир неприятностей. Например.

scanResult.bleDevice.establishConnection(false).flatMapCompletable { connection ->
        connection.writeCharacteristic(UUID, "reboot".toByteArray(Charset.defaultCharset())).ignoreElement()
}

Исходное установленное соединение никогда не завершается должным образом, а только возвращает ошибку о том, что устройство отключилось, что, при наличии всех других видов кода для обработки неправильных отключений, становится трудным. Если я попытаюсь избавиться от соединения во время onComplete из writeCharacteristic Кажется, я никогда не получаю надлежащего обратного вызова. Я не уверен, что в этом есть какой-то конкретный bug, но скорее я ищу информацию о том, как правильно


person Nic Capdevila    schedule 25.03.2019    source источник


Ответы (1)


Вопрос больше связан с использованием RxJava 2, чем с библиотекой. Чтобы решить вашу проблему, вам нужно сначала сохранить подписку на .establishConnection(), пока она не будет испущена, и не произойдет последующая запись. Код может выглядеть так:

scanResult.bleDevice.establishConnection(false) // establish the connection
    .publish { connectionObs ->
        // it will be needed to be subscribed until something will happen on it so a need to publish
        connectionObs.takeUntil( // keep the connection subscribed until...
            connectionObs.flatMapSingle {
                // ...the first write will complete
                it.writeCharacteristic(
                    uuid,
                    "reboot".toByteArray(Charset.defaultCharset())
                )
            }
        )
    }
    .ignoreElements()
person Dariusz Seweryn    schedule 27.03.2019
comment
Это прекрасно. Да, мой вопрос был больше направлен на RxJava2, вы правы. Спасибо вам за помощь - person Nic Capdevila; 28.03.2019