RxAndroidBle: Crash when trying to connect too fast [UndeliverableException]

lib version 1.5 rx2 I am facing issue in my app and in the sample app but i cannot find where the issue source is.

To reproduce, it’s really easy, you have to try a connection just right after reactivate Bluetooth on the device (about 1 sec after). I think the GATT stack is not really ready but in fact it throw a disconnection although the connection process is not done. it’s seems that a exception is not handle and rx is not happy but i am not sure.

logs :

03-08 14:47:18.292 11563-11677/com.polidea.rxandroidble.sample I/RxBle#ConnectionOperationQueue: Connection operations queue to be terminated (AA:BB:CC:11:22:33)
03-08 14:47:18.295 11563-11676/com.polidea.rxandroidble.sample D/RxBle#Executors$RunnableAdapter: Terminated.
03-08 14:47:18.297 11563-11677/com.polidea.rxandroidble.sample D/RxBle#ClientOperationQueue: QUEUED   ConnectOperation(154038096)
03-08 14:47:18.298 11563-11580/com.polidea.rxandroidble.sample D/RxBle#ClientOperationQueue: STARTED  ConnectOperation(154038096)
03-08 14:47:18.302 11563-11677/com.polidea.rxandroidble.sample D/RxBle#ClientOperationQueue: QUEUED   DisconnectOperation(110097737)
03-08 14:47:18.303 11563-11586/com.polidea.rxandroidble.sample W/System.err: io.reactivex.exceptions.UndeliverableException: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from AA:BB:CC:11:22:33
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver.onError(ObservableUnsubscribeOn.java:67)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.tryOnError(ObservableCreate.java:85)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:73)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.util.DisposableUtil$3.onError(DisposableUtil.java:60)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleDoFinally$DoFinallyObserver.onError(SingleDoFinally.java:81)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleTimeout$TimeoutMainObserver.onError(SingleTimeout.java:142)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleCreate$Emitter.tryOnError(SingleCreate.java:95)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleCreate$Emitter.onError(SingleCreate.java:81)
03-08 14:47:18.304 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.util.DisposableUtil$1.onError(DisposableUtil.java:24)
03-08 14:47:18.305 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableElementAtSingle$ElementAtSubscriber.onError(FlowableElementAtSingle.java:101)
03-08 14:47:18.305 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.checkTerminate(FlowableFlatMap.java:566)
03-08 14:47:18.305 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drainLoop(FlowableFlatMap.java:374)
03-08 14:47:18.305 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drain(FlowableFlatMap.java:366)
03-08 14:47:18.305 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:605)
03-08 14:47:18.305 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:668)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleToFlowable$SingleToFlowableObserver.onError(SingleToFlowable.java:68)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableElementAtSingle$ElementAtObserver.onError(ObservableElementAtSingle.java:104)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:495)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:331)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:571)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableError.subscribeActual(ObservableError.java:37)
03-08 14:47:18.306 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCache$ReplayDisposable.replay(ObservableCache.java:350)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCache.subscribeActual(ObservableCache.java:85)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableElementAtSingle.subscribeActual(ObservableElementAtSingle.java:37)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribe(Single.java:3096)
03-08 14:47:18.307 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleToFlowable.subscribeActual(SingleToFlowable.java:37)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:13234)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:13180)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.onNext(FlowableFlatMap.java:163)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFromArray$ArraySubscription.fastPath(FlowableFromArray.java:134)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFromArray$BaseArraySubscription.request(FlowableFromArray.java:87)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.onSubscribe(FlowableFlatMap.java:115)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFromArray.subscribeActual(FlowableFromArray.java:37)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:13234)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:13180)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableFlatMapPublisher.subscribeActual(FlowableFlatMapPublisher.java:43)
03-08 14:47:18.308 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Flowable.subscribe(Flowable.java:13234)
03-08 14:47:18.309 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.flowable.FlowableElementAtSingle.subscribeActual(FlowableElementAtSingle.java:41)
03-08 14:47:18.309 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribe(Single.java:3096)
03-08 14:47:18.309 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribeWith(Single.java:3140)
03-08 14:47:18.309 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.operations.ConnectOperation$4.subscribe(ConnectOperation.java:144)
03-08 14:47:18.309 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
03-08 14:47:18.309 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribe(Single.java:3096)
03-08 14:47:18.310 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleTimeout.subscribeActual(SingleTimeout.java:53)
03-08 14:47:18.310 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribe(Single.java:3096)
03-08 14:47:18.310 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.single.SingleDoFinally.subscribeActual(SingleDoFinally.java:46)
03-08 14:47:18.310 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribe(Single.java:3096)
03-08 14:47:18.311 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Single.subscribeWith(Single.java:3140)
03-08 14:47:18.313 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.operations.ConnectOperation.protectedRun(ConnectOperation.java:79)
03-08 14:47:18.313 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.QueueOperation$1.subscribe(QueueOperation.java:41)
03-08 14:47:18.313 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
03-08 14:47:18.313 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
03-08 14:47:18.314 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at java.lang.Thread.run(Thread.java:761)
03-08 14:47:18.315 11563-11586/com.polidea.rxandroidble.sample W/System.err: Caused by: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from AA:BB:CC:11:22:33
03-08 14:47:18.315 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter$1.apply(DisconnectionRouter.java:38)
03-08 14:47:18.315 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter$1.apply(DisconnectionRouter.java:35)
03-08 14:47:18.315 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:59)
03-08 14:47:18.315 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableConcatMap$ConcatMapDelayErrorObserver.drain(ObservableConcatMap.java:464)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableConcatMap$ConcatMapDelayErrorObserver.onSubscribe(ObservableConcatMap.java:324)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:30)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableConcatMap.subscribeActual(ObservableConcatMap.java:54)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFilter.subscribeActual(ObservableFilter.java:30)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
03-08 14:47:18.316 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableElementAt.subscribeActual(ObservableElementAt.java:36)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCache$CacheState.connect(ObservableCache.java:216)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableCache.subscribeActual(ObservableCache.java:82)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11180)
03-08 14:47:18.317 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11058)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter.<init>(DisconnectionRouter.java:60)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter_Factory.get(DisconnectionRouter_Factory.java:33)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter_Factory.get(DisconnectionRouter_Factory.java:10)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at bleshadow.dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback_Factory.get(RxBleGattCallback_Factory.java:33)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback_Factory.get(RxBleGattCallback_Factory.java:8)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at bleshadow.dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.DaggerClientComponent$DeviceComponentImpl$ConnectionComponentImpl.connectOperation(DaggerClientComponent.java:713)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.ConnectorImpl$1.call(ConnectorImpl.java:56)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.internal.connection.ConnectorImpl$1.call(ConnectorImpl.java:41)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:32)
03-08 14:47:18.318 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableDoFinally.subscribeActual(ObservableDoFinally.java:45)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:39)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableTakeUntil.subscribeActual(ObservableTakeUntil.java:41)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableObserveOn.subscribeActual(ObservableObserveOn.java:45)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.internal.operators.observable.ObservableDoFinally.subscribeActual(ObservableDoFinally.java:45)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11180)
03-08 14:47:18.319 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at io.reactivex.Observable.subscribe(Observable.java:11109)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.sample.example2_connection.ConnectionExampleActivity.onConnectToggleClick(ConnectionExampleActivity.java:52)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.polidea.rxandroidble2.sample.example2_connection.ConnectionExampleActivity_ViewBinding$1.doClick(ConnectionExampleActivity_ViewBinding.java:43)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at android.view.View.performClick(View.java:5637)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at android.view.View$PerformClick.run(View.java:22429)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at android.os.Looper.loop(Looper.java:154)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6119)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
03-08 14:47:18.320 11563-11586/com.polidea.rxandroidble.sample W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
03-08 14:47:18.322 11563-11586/com.polidea.rxandroidble.sample E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
                                                                                 Process: com.polidea.rxandroidble.sample, PID: 11563
                                                                                 io.reactivex.exceptions.UndeliverableException: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from AA:BB:CC:11:22:33
                                                                                     at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366)
                                                                                     at io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver.onError(ObservableUnsubscribeOn.java:67)
                                                                                     at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.tryOnError(ObservableCreate.java:85)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:73)
                                                                                     at com.polidea.rxandroidble2.internal.util.DisposableUtil$3.onError(DisposableUtil.java:60)
                                                                                     at io.reactivex.internal.operators.single.SingleDoFinally$DoFinallyObserver.onError(SingleDoFinally.java:81)
                                                                                     at io.reactivex.internal.operators.single.SingleTimeout$TimeoutMainObserver.onError(SingleTimeout.java:142)
                                                                                     at io.reactivex.internal.operators.single.SingleCreate$Emitter.tryOnError(SingleCreate.java:95)
                                                                                     at io.reactivex.internal.operators.single.SingleCreate$Emitter.onError(SingleCreate.java:81)
                                                                                     at com.polidea.rxandroidble2.internal.util.DisposableUtil$1.onError(DisposableUtil.java:24)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableElementAtSingle$ElementAtSubscriber.onError(FlowableElementAtSingle.java:101)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.checkTerminate(FlowableFlatMap.java:566)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drainLoop(FlowableFlatMap.java:374)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drain(FlowableFlatMap.java:366)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:605)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:668)
                                                                                     at io.reactivex.internal.operators.single.SingleToFlowable$SingleToFlowableObserver.onError(SingleToFlowable.java:68)
                                                                                     at io.reactivex.internal.operators.observable.ObservableElementAtSingle$ElementAtObserver.onError(ObservableElementAtSingle.java:104)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:495)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:331)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:571)
                                                                                     at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63)
                                                                                     at io.reactivex.internal.operators.observable.ObservableError.subscribeActual(ObservableError.java:37)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
                                                                                     at io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCache$ReplayDisposable.replay(ObservableCache.java:350)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCache.subscribeActual(ObservableCache.java:85)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableElementAtSingle.subscribeActual(ObservableElementAtSingle.java:37)
                                                                                     at io.reactivex.Single.subscribe(Single.java:3096)
03-08 14:47:18.324 11563-11586/com.polidea.rxandroidble.sample E/AndroidRuntime:     at io.reactivex.internal.operators.single.SingleToFlowable.subscribeActual(SingleToFlowable.java:37)
                                                                                     at io.reactivex.Flowable.subscribe(Flowable.java:13234)
                                                                                     at io.reactivex.Flowable.subscribe(Flowable.java:13180)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.onNext(FlowableFlatMap.java:163)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFromArray$ArraySubscription.fastPath(FlowableFromArray.java:134)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFromArray$BaseArraySubscription.request(FlowableFromArray.java:87)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.onSubscribe(FlowableFlatMap.java:115)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFromArray.subscribeActual(FlowableFromArray.java:37)
                                                                                     at io.reactivex.Flowable.subscribe(Flowable.java:13234)
                                                                                     at io.reactivex.Flowable.subscribe(Flowable.java:13180)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableFlatMapPublisher.subscribeActual(FlowableFlatMapPublisher.java:43)
                                                                                     at io.reactivex.Flowable.subscribe(Flowable.java:13234)
                                                                                     at io.reactivex.internal.operators.flowable.FlowableElementAtSingle.subscribeActual(FlowableElementAtSingle.java:41)
                                                                                     at io.reactivex.Single.subscribe(Single.java:3096)
                                                                                     at io.reactivex.Single.subscribeWith(Single.java:3140)
                                                                                     at com.polidea.rxandroidble2.internal.operations.ConnectOperation$4.subscribe(ConnectOperation.java:144)
                                                                                     at io.reactivex.internal.operators.single.SingleCreate.subscribeActual(SingleCreate.java:39)
                                                                                     at io.reactivex.Single.subscribe(Single.java:3096)
                                                                                     at io.reactivex.internal.operators.single.SingleTimeout.subscribeActual(SingleTimeout.java:53)
                                                                                     at io.reactivex.Single.subscribe(Single.java:3096)
                                                                                     at io.reactivex.internal.operators.single.SingleDoFinally.subscribeActual(SingleDoFinally.java:46)
                                                                                     at io.reactivex.Single.subscribe(Single.java:3096)
                                                                                     at io.reactivex.Single.subscribeWith(Single.java:3140)
                                                                                     at com.polidea.rxandroidble2.internal.operations.ConnectOperation.protectedRun(ConnectOperation.java:79)
                                                                                     at com.polidea.rxandroidble2.internal.QueueOperation$1.subscribe(QueueOperation.java:41)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
                                                                                     at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:38)
                                                                                     at io.reactivex.internal.schedulers.ScheduledDirectTask.call(ScheduledDirectTask.java:26)
                                                                                     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                                                                                     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                                                     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                                                     at java.lang.Thread.run(Thread.java:761)
                                                                                  Caused by: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from AA:BB:CC:11:22:33
                                                                                     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter$1.apply(DisconnectionRouter.java:38)
                                                                                     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter$1.apply(DisconnectionRouter.java:35)
                                                                                     at io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:59)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52)
                                                                                     at io.reactivex.internal.operators.observable.ObservableConcatMap$ConcatMapDelayErrorObserver.drain(ObservableConcatMap.java:464)
                                                                                     at io.reactivex.internal.operators.observable.ObservableConcatMap$ConcatMapDelayErrorObserver.onSubscribe(ObservableConcatMap.java:324)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:30)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableConcatMap.subscribeActual(ObservableConcatMap.java:54)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
03-08 14:47:18.328 11563-11586/com.polidea.rxandroidble.sample E/AndroidRuntime:     at io.reactivex.internal.operators.observable.ObservableFilter.subscribeActual(ObservableFilter.java:30)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableElementAt.subscribeActual(ObservableElementAt.java:36)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCache$CacheState.connect(ObservableCache.java:216)
                                                                                     at io.reactivex.internal.operators.observable.ObservableCache.subscribeActual(ObservableCache.java:82)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11180)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11058)
                                                                                     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter.<init>(DisconnectionRouter.java:60)
                                                                                     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter_Factory.get(DisconnectionRouter_Factory.java:33)
                                                                                     at com.polidea.rxandroidble2.internal.connection.DisconnectionRouter_Factory.get(DisconnectionRouter_Factory.java:10)
                                                                                     at bleshadow.dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
                                                                                     at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback_Factory.get(RxBleGattCallback_Factory.java:33)
                                                                                     at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback_Factory.get(RxBleGattCallback_Factory.java:8)
                                                                                     at bleshadow.dagger.internal.DoubleCheck.get(DoubleCheck.java:47)
                                                                                     at com.polidea.rxandroidble2.DaggerClientComponent$DeviceComponentImpl$ConnectionComponentImpl.connectOperation(DaggerClientComponent.java:713)
                                                                                     at com.polidea.rxandroidble2.internal.connection.ConnectorImpl$1.call(ConnectorImpl.java:56)
                                                                                     at com.polidea.rxandroidble2.internal.connection.ConnectorImpl$1.call(ConnectorImpl.java:41)
                                                                                     at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:32)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableDoFinally.subscribeActual(ObservableDoFinally.java:45)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableDefer.subscribeActual(ObservableDefer.java:39)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableTakeUntil.subscribeActual(ObservableTakeUntil.java:41)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableObserveOn.subscribeActual(ObservableObserveOn.java:45)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.internal.operators.observable.ObservableDoFinally.subscribeActual(ObservableDoFinally.java:45)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11180)
                                                                                     at io.reactivex.Observable.subscribe(Observable.java:11109)
                                                                                     at com.polidea.rxandroidble2.sample.example2_connection.ConnectionExampleActivity.onConnectToggleClick(ConnectionExampleActivity.java:52)
03-08 14:47:18.328 11563-11586/com.polidea.rxandroidble.sample E/AndroidRuntime:     at com.polidea.rxandroidble2.sample.example2_connection.ConnectionExampleActivity_ViewBinding$1.doClick(ConnectionExampleActivity_ViewBinding.java:43)
                                                                                     at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
                                                                                     at android.view.View.performClick(View.java:5637)
                                                                                     at android.view.View$PerformClick.run(View.java:22429)
                                                                                     at android.os.Handler.handleCallback(Handler.java:751)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                     at android.os.Looper.loop(Looper.java:154)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:6119)
                                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
03-08 14:47:18.334 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: exClass=com.polidea.rxandroidble2.exceptions.BleDisconnectedException
03-08 14:47:18.334 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: exMsg=Disconnected from AA:BB:CC:11:22:33
03-08 14:47:18.334 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: file=DisconnectionRouter.java
03-08 14:47:18.334 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: class=com.polidea.rxandroidble2.internal.connection.DisconnectionRouter$1
03-08 14:47:18.334 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: method=apply line=38
03-08 14:47:18.335 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: stack=io.reactivex.exceptions.UndeliverableException: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from AA:BB:CC:11:22:33
                                                                            at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366)
                                                                            at io.reactivex.internal.operators.observable.ObservableUnsubscribeOn$UnsubscribeObserver.onError(ObservableUnsubscribeOn.java:67)
                                                                            at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeOnObserver.onError(ObservableSubscribeOn.java:63)
                                                                            at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.tryOnError(ObservableCreate.java:85)
                                                                            at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:73)
                                                                            at com.polidea.rxandroidble2.internal.util.DisposableUtil$3.onError(DisposableUtil.java:60)
                                                                            at io.reactivex.internal.operators.single.SingleDoFinally$DoFinallyObserver.onError(SingleDoFinally.java:81)
                                                                            at io.reactivex.internal.operators.single.SingleTimeout$TimeoutMainObserver.onError(SingleTimeout.java:142)
                                                                            at io.reactivex.internal.operators.single.SingleCreate$Emitter.tryOnError(SingleCreate.java:95)
                                                                            at io.reactivex.internal.operators.single.SingleCreate$Emitter.onError(SingleCreate.java:81)
                                                                            at com.polidea.rxandroidble2.internal.util.DisposableUtil$1.onError(DisposableUtil.java:24)
                                                                            at io.reactivex.internal.operators.flowable.FlowableElementAtSingle$ElementAtSubscriber.onError(FlowableElementAtSingle.java:101)
                                                                            at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.checkTerminate(FlowableFlatMap.java:566)
                                                                            at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drainLoop(FlowableFlatMap.java:374)
                                                                            at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.drain(FlowableFlatMap.java:366)
                                                                            at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.innerError(FlowableFlatMap.java:605)
                                                                            at io.reactivex.internal.operators.flowable.FlowableFlatMap$InnerSubscriber.onError(FlowableFlatMap.java:668)
                                                                            at io.reactivex.internal.operators.single.SingleToFlowable$SingleToFlowableObserver.onError(SingleToFlowable.java:68)
                                                                            at io.reactivex.internal.operators.observable.ObservableElementAtSingle$ElementAtObserver.onError(ObservableElementAtSingle.java:104)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.checkTerminate(ObservableFlatMap.java:495)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drainLoop(ObservableFlatMap.java:331)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.drain(ObservableFlatMap.java:323)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:571)
                                                                            at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63)
                                                                            at io.reactivex.internal.operators.observable.ObservableError.subscribeActual(ObservableError.java:37)
                                                                            at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
                                                                            at io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246)
                                                                            at io.reactivex.internal.operators.observable.ObservableCache$ReplayDisposable.replay(ObservableCache.java:350)
                                                                            at io.reactivex.internal.operators.observable.ObservableCache.subscribeActual(ObservableCache.java:85)
                                                                            at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                            at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
                                                                            at io.reactivex.Observable.subscribe(Observable.java:11194)
                                                                            at io.reactivex.internal.operators.observable.ObservableElementAtSingle.subscribeActual(ObservableElementAtSingle.java:37)
                                                                            at io.reactivex.Single.subscribe(Single.java:3096)
                                                                            at io.reactivex.internal.operators.single.SingleToFlowable.subscribeActual(SingleToFlowable.java:37)
                                                                        	at io.reactivex.Flowable.subscribe(Fl
03-08 14:47:18.335 11563-11586/com.polidea.rxandroidble.sample D/Error: ERR: TOTAL BYTES WRITTEN: 25616

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Comments: 60 (15 by maintainers)

Commits related to this issue

Most upvoted comments

Hello everyone,

I was investigating this issue recently.

The root cause of the problem is the threading of Android OS — callbacks may be called on arbitrary threads. The library does not know how it will be used and thus it is routing errors to all listeners. Because the errors sometimes may be routed through many merged observables they may appear more than once in an observable chain…

One of the differences between RxJava 1 and RxJava 2 is that the former did swallow exceptions that happened after the chain was unsubscribed whereas the latter is throwing an UndeliverableException in this situation. With the current library architecture it is impossible to mitigate this behaviour and the suggested workaround is to add a code similar to what @thuytrinh wrote above:

Kotlin

RxJavaPlugins.setErrorHandler({ error ->
    if (error is UndeliverableException && error.cause is BleException) {
        return // ignore BleExceptions as they were surely delivered at least once
    }
    // add other custom handlers if needed
    throw error
})

Java

RxJavaPlugins.setErrorHandler(error -> {
    if (error instanceof UndeliverableException && error.cause instanceof BleException) {
        return; // ignore BleExceptions as they were surely delivered at least once
    }
    // add other custom handlers if needed
    throw error;
});

We’ve seen these BleDisconnectedExceptions wrapped in UndeliverableException in our projects for a while now, when using RxJava2.

This happens when you dispose of the subscription while a disconnect takes place. The RxAndroidBle code delivers this exception just before your code disposes of the subscription but was about to reach your just-disposed error-handler just after your code disposes of it.

We worked around this by registering an uncaught-exception handler by calling RxJavaPlugins.setErrorHandler and handling the UndeliverableException appropriately. The handler we used just logged the uncaught-exception, but did not let the app crash.

Thank you for the suggestion. Unfortunately this is not the case in this library since the wrapped error is usually BleDisconnectedException. It happens due to the exception being routed to every Observable/Single/Completable derived from RxBleConnection.

If the user creates a single Observable from multiple others derived from RxBleConnection — the BleDisconnectedException will get emitted from all of them and only one will get handled by the Subscriber. The rest will get routed as UndeliverableExceptions — I have an idea on how to mitigate this problem but it will make the library harder to use — the user would need to think on where they want to get the error routed in their chain of Observables. And it could potentially drastically alter the API where if error is not routed to a particular place then e.g. a Maybe would be returned instead of Single.

This approach needs to get evaluated.

I had a few time exception error on the disconnection with the last snapshot :

03-21 15:26:46.430 29682-29750/fr.test.myapp D/BluetoothGatt: cancelOpen() - device: 00:00:00:00:00:00
03-21 15:26:46.431 29682-29742/fr.test.myapp D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=6 device=00:00:00:00:00:00
03-21 15:26:46.436 29682-29753/fr.test.myapp W/System.err: io.reactivex.exceptions.UndeliverableException: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from 00:00:00:00:00:00
03-21 15:26:46.436 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
03-21 15:26:46.436 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:74)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at com.polidea.rxandroidble2.internal.util.QueueReleasingEmitterWrapper.onError(QueueReleasingEmitterWrapper.java:45)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.single.SingleToObservable$SingleToObservableObserver.onError(SingleToObservable.java:65)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.single.SingleTimeout$TimeoutMainObserver.onError(SingleTimeout.java:142)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:69)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.observable.ObservableElementAtSingle$ElementAtObserver.onError(ObservableElementAtSingle.java:104)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.observers.BasicFuseableObserver.onError(BasicFuseableObserver.java:100)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:261)
03-21 15:26:46.437 29682-29753/fr.test.myapp W/System.err:     at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:226)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at java.lang.Thread.run(Thread.java:761)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err: Caused by: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from 00:00:00:00:00:00
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:77)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:180)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
03-21 15:26:46.438 29682-29753/fr.test.myapp W/System.err:     at android.os.Binder.execTransact(Binder.java:565)

Then I am not alone. I was just about to paste an almost identical stacktrace.

I too have a call to connect again directly from my onConnectionFailure handler because I generally want to re-establish the connection ASAP.

E.g. this is the meat of my connection method.

val connectionSubscription = device.establishConnection(false)
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnDispose({onDisposeConnectionSubscription(device)})
                    .subscribe({ onConnectionReceived(device, it) }, { onConnectionFailure(device, it) })

Side note: doOnDispose does not appear to be called in the way doOnUnsubscribe is called in rx1 land. It is in fact not called at all for me, but I have also not looked enough at the RXJava guides to know if it should be.

Just in case my trace adds some value, here it is:

03-08 14:56:49.556 7264-7480 E/AndroidRuntime: FATAL EXCEPTION: pool-6-thread-1
                                               Process: com.example.rxble, PID: 7264
                                               io.reactivex.exceptions.UndeliverableException: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from 54:6C:0E:7B:3E:98
                                                   at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:367)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap$InnerObserver.onError(ObservableFlatMap.java:573)
                                                   at io.reactivex.internal.disposables.EmptyDisposable.error(EmptyDisposable.java:63)
                                                   at io.reactivex.internal.operators.observable.ObservableError.subscribeActual(ObservableError.java:37)
                                                   at io.reactivex.Observable.subscribe(Observable.java:11442)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
                                                   at io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246)
                                                   at io.reactivex.internal.operators.observable.ObservableCache$ReplayDisposable.replay(ObservableCache.java:350)
                                                   at io.reactivex.internal.operators.observable.ObservableCache.subscribeActual(ObservableCache.java:85)
                                                   at io.reactivex.Observable.subscribe(Observable.java:11442)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
                                                   at io.reactivex.Observable.subscribe(Observable.java:11442)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:162)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
                                                   at io.reactivex.internal.operators.observable.ObservableFromArray$FromArrayDisposable.run(ObservableFromArray.java:107)
                                                   at io.reactivex.internal.operators.observable.ObservableFromArray.subscribeActual(ObservableFromArray.java:36)
                                                   at io.reactivex.Observable.subscribe(Observable.java:11442)
                                                   at io.reactivex.internal.operators.observable.ObservableFlatMap.subscribeActual(ObservableFlatMap.java:55)
                                                   at io.reactivex.Observable.subscribe(Observable.java:11442)
                                                   at io.reactivex.internal.operators.observable.ObservableObserveOn.subscribeActual(ObservableObserveOn.java:45)
                                                   at io.reactivex.Observable.subscribe(Observable.java:11442)
                                                   at io.reactivex.internal.operators.observable.ObservableRetryPredicate$RepeatObserver.subscribeNext(ObservableRetryPredicate.java:111)
                                                   at io.reactivex.internal.operators.observable.ObservableRetryPredicate$RepeatObserver.onError(ObservableRetryPredicate.java:92)
                                                   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:276)
                                                   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:172)
                                                   at io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)
                                                   at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker$BooleanRunnable.run(ExecutorScheduler.java:261)
                                                   at io.reactivex.internal.schedulers.ExecutorScheduler$ExecutorWorker.run(ExecutorScheduler.java:226)
                                                   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                   at java.lang.Thread.run(Thread.java:762)
                                                Caused by: com.polidea.rxandroidble2.exceptions.BleDisconnectedException: Disconnected from 54:6C:0E:7B:3E:98
                                                   at com.polidea.rxandroidble2.internal.connection.RxBleGattCallback$2.onConnectionStateChange(RxBleGattCallback.java:77)
                                                   at android.bluetooth.BluetoothGatt$1.onClientConnectionState(BluetoothGatt.java:228)
                                                   at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
                                                   at android.os.Binder.execTransact(Binder.java:573)

@cuiti Yes that is right. You get an unhandled exception when you try to rethrow the error in Java.

I’m using the folowing in my project:

RxJavaPlugins.setErrorHandler(error -> {
            if (error instanceof UndeliverableException && error.getCause() instanceof BleException) {
                return; // ignore BleExceptions as they were surely delivered at least once
            } else {
                throw new Exception(error);
            }
        });

rxandroidble2 v1.5.0 @uKL Got the same error when trying to retry the connection. Any updates?

I believe you’re not looking at master branch. It’s already tryOnError (which in fact does the same inside).

Been there 😃

In fact, I aligned your example to work with a SensorTAG. The issue seems to be still there. I’ll try to chase it down.

I will try, I’ll update the thread when I have news.