UndeliverableException выбрасывается в потоке RxAndroidBle - PullRequest
0 голосов
/ 03 мая 2019

У меня неправильно работает BLE-устройство (датчик температуры), которое выдает исключение status 8 (GATT_INSUF_AUTHORIZATION or GATT_CONN_TIMEOUT) каждый раз, когда я пытаюсь подключиться к устройству.Меня не беспокоит это исключение, так как устройство неисправно.

Однако я продолжаю получать уведомления о том, что rxjava2 не правильно обработал ошибку при использовании RxAndroidBle (1.9.1);посмотреть здесь;

Это мой код.

 rxBleClient
                .getBleDevice(macAddress)
                .establishConnection(false)
                .flatMapSingle { it.readRssi() }
                .subscribe({ "test1:Success" }, { "test1:error" })

и ошибка

   I/RxBle#GattCallback: MAC='E9:CF:8A:D0:01:19'  onConnectionStateChange(), status=8, value=0
D/RxBle#ClientOperationQueue: FINISHED ConnectOperation(147547253) in 10257 ms
D/RxBle#ConnectionOperationQueue: Connection operations queue to be terminated (MAC='E9:CF:8A:D0:01:19')
    com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from MAC='E9:CF:8A:D0:01:19' with status 8 (GATT_INSUF_AUTHORIZATION or GATT_CONN_TIMEOUT)
        at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:77)
        at android.bluetooth.BluetoothGatt$1$4.run(BluetoothGatt.java:249)
        at android.bluetooth.BluetoothGatt.runOrQueueCallback(BluetoothGatt.java:725)
        at android.bluetooth.BluetoothGatt.-wrap0(Unknown Source:0)
        at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:244)
        at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
        at android.os.Binder.execTransact(Binder.java:697)
D/BleDeviceManagerNew$observeRssiTest: test1:error
E/plication$setupApp: Terminal Exception From RXJAVA was Not handled correctly
    io.reactivex.exceptions.UndeliverableException: The exception could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has nowhere to go to begin with. Further reading: https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from MAC='E9:CF:8A:D0:01:19' with status 8 (GATT_INSUF_AUTHORIZATION or GATT_CONN_TIMEOUT)
        at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
        at io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver.onError(ObservableUnsubscribeOn.java:67)
        at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)

Я не уверен, чтоиначе я должен сделать - я реализовал решение «поймать все», но мне не нравится этот подход;

RxJavaPlugins.setErrorHandler { e -> Timber.e(e, "Terminal Exception From RXJAVA was Not handled correctly") }

но не считаю это хорошим решением, как ожидалось, что я должен быть в состоянии обрабатывать исключения в паре.Любые предложения о том, где я ошибся?

1 Ответ

1 голос
/ 03 мая 2019

Ваш код в порядке. В библиотеке есть недостаток, который не позволяет добиться желаемого поведения. Больше по теме на вики-странице этой библиотеки .

Хотя возможно разработать API, который не будет выдавать UndeliverableException, для отключения BluetoothAdapter потребуется отдельная ошибка Observable или Completable, а для отключения RxBleConnection - отдельная ошибка. Пользователь будет ответственен за то, чтобы смешать их в своей цепочке соответствующим образом.

Текущий API не позволяет это.

...