2017-12-12 29 views
0

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); 

이 코드는 here를있는 RxAndroidBle 샘플과 동일 (onNotifyClick() 참조) I 연결이 끊길 때 연결 재 시도 할 수있는 .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) 

; 그러나 연결을 끊고 연결을 다시 시도하면 특성 알림을 다시 설정하고 즉시 연결을 끊습니다.

저의 목표는 블루투스 장치에 장시간 연속 연결을 시뮬레이트 할 수있게하는 것입니다. 연결이 활성화되어있는 동안 특성 알림을받을 수 있어야합니다. retryWhen()을 사용하여 다시 연결하고 알림을 설정하는 올바른 방법이 아니면 더 나은 해결책은 무엇입니까?

답변

0

RxBleDevice.establishConnection()에서 예외가 발생한 후 RxBleConnection이 제대로 해제되지 않는 것이 분명합니다. ConnectionSharingAdapter에 문제가 있습니다. 트릭을 할해야 일반 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을 취소하지해야합니다. 거의 동일한 효과가있는 .subscribe() 함수 바로 앞에 .takeUntil(Observable)을 사용하여 업스트림에서 구독을 취소 할 수도 있습니다.

편집 : 코드에서 둘 이상의 장소간에 동일한 연결을 공유해야하는 경우 동일한 Observable을 공유해야합니다. ConnectionSharingAdapter으로 달성 할 수는 있지만 위에서 언급 한 버그 인 것 같습니다. 드롭 인 대체는 ReplayingShare 연산자 일 수 있습니다.

또는 .subscribe()을 사용하여 흐름을 재 배열 할 수 있습니다. 그것에 대해 좋은 (비록 고급) 이야기가있다 Managing State with RxJava by Jake Wharton.

+0

이것은 하나의 장치에 하나의 연결 만 원한다면 제대로 작동하는 것 같습니다. 동일한 장치에 다른 연결을 원할 경우 다시 시도 할 수있는 방법이 있습니까? 목표는 두 연결을 동시에 유지하는 것입니다. – user3370201

+0

동일한 장치에 동시에 두 개의 연결을 설정할 수 없습니다. 주어진 순간에 오직 하나만있을 수 있습니다. 여전히 공유 할 수 있습니다. 원래 게시물에 작성한 것보다 많은 요구 사항과 코드가있는 것으로 보입니다. –

+0

마지막 코멘트가 약간 오인되었을 수도 있습니다. 나는 두 곳의 다른 장소에서 공유 연결을 사용했는지 물어볼 생각이었고, 연결이 끊어 졌을 때, 어떻게 다시 시도해야할까요?예를 들어 원래 게시물에서 참조한 샘플로 돌아가서, onConnectToggleClick()에서 생성 된 연결을 끊을 때 다시 연결하고 onNotifyClick()에서 설정 한 알림을 다시 설정하려면 if 연결이 끊어지면 어떻게해야합니까? – user3370201