Сброс уведомлений в RxAndroidBle при потере связи

Я пытаюсь настроить уведомления с помощью RxAndroidBle, однако, когда соединение с периферийным устройством теряется, уведомление, которое я настроил, нужно создавать снова. Я создаю уведомления следующим образом:

connectionObservable
                .flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid))
                .doOnNext(notificationObservable -> runOnUiThread(this::notificationHasBeenSetUp))
                .flatMap(notificationObservable -> notificationObservable)
                .retryWhen(errors -> errors.flatMap(error -> {
                    if (error instanceof BleDisconnectedException) {
                        Log.d("Retry", "Retrying");
                        return Observable.just(null);
                    }
                    return Observable.error(error);
                }))
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(this::onNotificationReceived, this::onNotificationSetupFailure);

Этот код аналогичен образцу RxAndroidBle, расположенному здесь (см. onNotifyClick()), за исключением того, что я добавил блок .retryWhen() для повторной попытки подключения при потере соединения. Уведомление успешно настроено при установлении соединения, и вызывается onNotificationReceived(). Иногда это будет переподключаться несколько раз, прежде чем я неоднократно не смогу подключиться, и setCharacteristicNotification() будет неоднократно вызываться.

Это часть журналов, показывающая проблему, с которой я сталкиваюсь:

12-12 11:36:23.420 10841-10841/com.polidea.rxandroidble.sample I/CharacteristicOperationExampleActivity: Hey, connection has been established!
12-12 11:36:23.441 10841-10860/com.polidea.rxandroidble.sample D/BluetoothGatt: onConnectionUpdated() - Device=F9:A1:74:C0:09:3A interval=36 latency=0 timeout=500 status=0
12-12 11:36:24.819 10841-10841/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:24.823 10841-10841/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(204891860)
12-12 11:36:24.825 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(204891860)
12-12 11:36:24.889 10841-10859/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onDescriptorWrite descriptor=00002902-0000-1000-8000-00805f9b34fb status=0
12-12 11:36:24.893 10841-10841/com.polidea.rxandroidble.sample D/Notifications: Notifications set up
12-12 11:36:24.893 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(204891860)
12-12 11:36:26.252 10841-10860/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:26.814 10841-10851/com.polidea.rxandroidble.sample I/zygote64: Compiler allocated 6MB to compile void android.view.ViewRootImpl.performTraversals()
12-12 11:36:27.681 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: onConnectionUpdated() - Device=F9:A1:74:C0:09:3A interval=24 latency=1 timeout=75 status=0
12-12 11:36:28.271 10841-10860/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:28.401 10841-10851/com.polidea.rxandroidble.sample I/zygote64: Do full code cache collection, code=103KB, data=93KB
12-12 11:36:28.402 10841-10851/com.polidea.rxandroidble.sample I/zygote64: After code cache collection, code=101KB, data=74KB
12-12 11:36:30.261 10841-10859/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:32.271 10841-10860/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:34.283 10841-10859/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:34.657 10841-10851/com.polidea.rxandroidble.sample I/zygote64: Do partial code cache collection, code=125KB, data=99KB
12-12 11:36:34.657 10841-10851/com.polidea.rxandroidble.sample I/zygote64: After code cache collection, code=125KB, data=99KB
12-12 11:36:34.658 10841-10851/com.polidea.rxandroidble.sample I/zygote64: Increasing code cache capacity to 512KB
12-12 11:36:36.323 10841-10860/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:38.273 10841-10859/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:40.311 10841-10860/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onCharacteristicChanged characteristic=00002a19-0000-1000-8000-00805f9b34fb
12-12 11:36:41.846 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: onClientConnectionState() - status=19 clientIf=6 device=F9:A1:74:C0:09:3A
12-12 11:36:41.854 10841-10859/com.polidea.rxandroidble.sample D/RxBle#BluetoothGatt$1: onConnectionStateChange newState=0 status=19
12-12 11:36:41.873 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.879 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(54354895)
12-12 11:36:41.884 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(54354895)
12-12 11:36:41.885 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.895 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:41.900 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(254074559)
12-12 11:36:41.902 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(54354895)
12-12 11:36:41.904 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.904 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(254074559)
12-12 11:36:41.909 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(231910737)
12-12 11:36:41.914 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.916 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(254074559)
12-12 11:36:41.918 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(231910737)
12-12 11:36:41.923 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:41.926 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(48916564)
12-12 11:36:41.928 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.935 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(258401717)
12-12 11:36:41.935 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(231910737)
12-12 11:36:41.937 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.937 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(48916564)
12-12 11:36:41.941 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:41.947 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(48916564)
12-12 11:36:41.947 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(261960698)
12-12 11:36:41.948 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(258401717)
12-12 11:36:41.949 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.952 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(184043911)
12-12 11:36:41.955 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(261960698)
12-12 11:36:41.957 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(258401717)
12-12 11:36:41.957 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.958 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(184043911)
12-12 11:36:41.961 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:41.964 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(233807588)
12-12 11:36:41.966 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.969 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(92084997)
12-12 11:36:41.970 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(184043911)
12-12 11:36:41.970 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(233807588)
12-12 11:36:41.972 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.973 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(92084997)
12-12 11:36:41.975 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:41.978 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(4571907)
12-12 11:36:41.979 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.982 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(85913073)
12-12 11:36:41.983 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(92084997)
12-12 11:36:41.984 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(4571907)
12-12 11:36:41.985 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(85913073)
12-12 11:36:41.986 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.989 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:41.991 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(44454620)
12-12 11:36:41.993 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:41.995 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(260032157)
12-12 11:36:41.996 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(85913073)
12-12 11:36:41.997 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(44454620)
12-12 11:36:41.998 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:41.998 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(260032157)
12-12 11:36:42.001 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:42.003 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(205319160)
12-12 11:36:42.005 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:42.007 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(141963529)
12-12 11:36:42.007 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(260032157)
12-12 11:36:42.009 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:42.010 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(205319160)
12-12 11:36:42.012 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:42.014 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(207186388)
12-12 11:36:42.016 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:42.019 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(12579274)
12-12 11:36:42.020 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(205319160)
12-12 11:36:42.020 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(207186388)
12-12 11:36:42.021 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:42.022 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(141963529)
12-12 11:36:42.024 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:42.027 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(227068595)
12-12 11:36:42.029 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:42.031 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(34646817)
12-12 11:36:42.032 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(141963529)
12-12 11:36:42.033 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(227068595)
12-12 11:36:42.034 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:42.034 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(12579274)
12-12 11:36:42.037 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:42.040 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(200262604)
12-12 11:36:42.041 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:42.044 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(3707597)
12-12 11:36:42.044 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(12579274)
12-12 11:36:42.046 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(200262604)
12-12 11:36:42.046 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(34646817)
12-12 11:36:42.047 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:42.050 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:42.053 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(115232257)
12-12 11:36:42.054 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:42.056 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(34646817)
12-12 11:36:42.056 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(187740798)
12-12 11:36:42.058 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(3707597)
12-12 11:36:42.058 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(115232257)
12-12 11:36:42.060 10841-10859/com.polidea.rxandroidble.sample D/Retry: Retrying
12-12 11:36:42.064 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: true
12-12 11:36:42.067 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(8463785)
12-12 11:36:42.067 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue: FINISHED DescriptorWriteOperation(3707597)
12-12 11:36:42.069 10841-10859/com.polidea.rxandroidble.sample D/BluetoothGatt: setCharacteristicNotification() - uuid: 00002a19-0000-1000-8000-00805f9b34fb enable: false
12-12 11:36:42.070 10841-10887/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:  STARTED DescriptorWriteOperation(187740798)
12-12 11:36:42.072 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue:   QUEUED DescriptorWriteOperation(22091834)
12-12 11:36:42.077 10841-10859/com.polidea.rxandroidble.sample D/RxBle#ConnectionOperationQueue$2:  REMOVED DescriptorWriteOperation(8463785)

Судя по логам, соединение установлено успешно, и я получаю несколько уведомлений об изменении характеристик; однако после того, как я потеряю соединение и повторю попытку подключения, я снова настраиваю характерные уведомления и сразу же отключаюсь.

Моя цель - имитировать длительное непрерывное соединение с устройством Bluetooth. Пока соединение активно, мне нужно иметь возможность получать характерные уведомления. Если использование retryWhen() не является правильным способом повторного подключения и настройки уведомлений, то какое решение может быть лучшим?


person user3370201    schedule 12.12.2017    source источник


Ответы (1)


По-видимому, есть проблема с ConnectionSharingAdapter, которая не освобождает должным образом RxBleConnection после того, как из RxBleDevice.establishConnection() было сгенерировано исключение.

Использование простого RxJava API должно помочь:

subscription = rxBleDevice.establishConnection()
            .flatMap(rxBleConnection -> rxBleConnection.setupNotification(characteristicUuid))
            .doOnNext(notificationObservable -> runOnUiThread(this::notificationHasBeenSetUp))
            .flatMap(notificationObservable -> notificationObservable)
            .retryWhen(errors -> errors.flatMap(error -> {
                if (error instanceof BleDisconnectedException) {
                    Log.d("Retry", "Retrying");
                    return Observable.just(null);
                }
                return Observable.error(error);
            }))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::onNotificationReceived, this::onNotificationSetupFailure);

Нужно просто отписаться от subscription, когда соединение больше не нужно. Также можно отказаться от подписки на восходящий поток, используя .takeUntil(Observable) непосредственно перед функцией .subscribe(), которая будет иметь примерно такой же эффект.

Редактировать: если вам нужно использовать одно и то же соединение между несколькими местами в коде, вам нужно будет использовать один и тот же Observable. Хотя этого можно добиться с помощью ConnectionSharingAdapter, похоже, это ошибка, как упоминалось выше. Вставной заменой может быть оператор ReplayingShare. .

В качестве альтернативы можно перестроить поток так, чтобы его можно было достичь с помощью одного .subscribe(). Об этом есть хороший (хотя и продвинутый) доклад Managing State with RxJava Джейка Уортона .

person Dariusz Seweryn    schedule 18.12.2017
comment
Кажется, это работает нормально, если я хочу иметь только одно подключение к одному устройству. Есть ли способ, с помощью которого я могу повторить попытку, если я хочу еще раз подключиться к тому же устройству? Цель состоит в том, чтобы поддерживать оба соединения одновременно. - person user3370201; 18.12.2017
comment
Вы не можете иметь два подключения к одному и тому же устройству одновременно. В любой момент может быть только один. Вы все еще можете поделиться им. Кажется, у вас больше требований и кода, чем вы написали в исходном посте. - person Dariusz Seweryn; 18.12.2017
comment
Мой последний комментарий, возможно, был немного неправильно сформулирован. Я хотел спросить, если у меня есть общее соединение, используемое в двух разных местах, и соединение обрывается, как мне правильно повторить попытку? Например, возвращаясь к образцу, на который я ссылался в исходном посте, если бы я хотел, чтобы соединение, созданное в onConnectToggleClick(), повторно подключалось при отключении, а также чтобы уведомления, настроенные в onNotifyClick(), также сбрасывались, если соединение разрывается, как мне это сделать? это? - person user3370201; 18.12.2017
comment
Я отредактировал ответ. Кажется, есть подходящая замена для ConnectionSharingAdapter и хороший разговор о том, как можно избавиться от необходимости в ней. - person Dariusz Seweryn; 19.12.2017
comment
@DariuszSeweryn Я пытался адаптировать ваш ответ, чтобы иметь механизм повторных попыток отсрочки (т. е. максимальное количество повторных попыток и время между ними - что-то вроде pastebin.com/hr91kykU), но я столкнулся с фатальным исключением (pastebin.com/KkK9Akd2 ). есть идеи, как лучше всего этого добиться? - person takecare; 12.11.2018