RxAndroidBle: Crash due to LocationServicesOkObservableApi23 somewhere has null

Hi guys! Thank you for that awesome lib you’ve created! I was migrating from com.polidea.rxandroidble:rxandroidble:1.4.3 to com.polidea.rxandroidble2:rxandroidble:1.5.0 recently and faced troubles on APIs > 22. Seems that inside a library there is some nulls passed to observables, but RxJava2 does not allow this. So I can’t use it any more. That seems to be a thing with location permissions, but actually runtime ACCESS_COARSE_LOCATION was granted. Ccrash sometimes happens when I simply try to obtain RxBleClient instance. I would really appreciate your help. Thanks in advance!

Summary

Library version

1.5.0

Logs from the application (crash report)

03-21 19:53:04.561 29366-29533/com.vue E/AndroidRuntime: FATAL EXCEPTION: RxComputationThreadPool-1
                                                         Process: com.vue, PID: 29366
                                                         java.lang.NullPointerException: Attempt to invoke interface method 'boolean io.reactivex.internal.fuseable.SimpleQueue.offer(java.lang.Object)' on a null object reference
                                                             at io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapInnerObserver.onNext(ObservableSwitchMap.java:372)
                                                             at io.reactivex.internal.operators.observable.ObservableMap$MapObserver.onNext(ObservableMap.java:64)
                                                             at com.polidea.rxandroidble2.internal.util.LocationServicesOkObservableApi23.subscribeActual(LocationServicesOkObservableApi23.java:35)
                                                             at io.reactivex.Observable.subscribe(Observable.java:12005)
                                                             at io.reactivex.internal.operators.observable.ObservableMap.subscribeActual(ObservableMap.java:33)
                                                             at io.reactivex.Observable.subscribe(Observable.java:12005)
                                                             at io.reactivex.internal.operators.observable.ObservableSwitchMap$SwitchMapObserver.onNext(ObservableSwitchMap.java:127)
                                                             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:12005)
                                                             at io.reactivex.internal.operators.observable.ObservableConcatMap.subscribeActual(ObservableConcatMap.java:54)
                                                             at io.reactivex.Observable.subscribe(Observable.java:12005)
                                                             at io.reactivex.internal.operators.observable.ObservableSwitchMap.subscribeActual(ObservableSwitchMap.java:51)
                                                             at io.reactivex.Observable.subscribe(Observable.java:12005)
                                                             at io.reactivex.internal.operators.observable.ObservableSkip.subscribeActual(ObservableSkip.java:29)
                                                             at io.reactivex.Observable.subscribe(Observable.java:12005)
                                                             at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.subscribeInner(ObservableFlatMap.java:165)
                                                             at io.reactivex.internal.operators.observable.ObservableFlatMap$MergeObserver.onNext(ObservableFlatMap.java:139)
                                                             at io.reactivex.internal.observers.DeferredScalarDisposable.complete(DeferredScalarDisposable.java:82)
                                                             at io.reactivex.internal.operators.single.SingleToObservable$SingleToObservableObserver.onSuccess(SingleToObservable.java:73)
                                                             at io.reactivex.internal.operators.single.SingleMap$MapSingleObserver.onSuccess(SingleMap.java:64)
                                                             at io.reactivex.internal.operators.observable.ObservableCountSingle$CountObserver.onComplete(ObservableCountSingle.java:83)
                                                             at io.reactivex.internal.operators.observable.ObservableTakeWhile$TakeWhileObserver.onNext(ObservableTakeWhile.java:86)
                                                             at io.reactivex.internal.operators.observable.ObservableInterval$IntervalObserver.run(ObservableInterval.java:83)
                                                             at io.reactivex.internal.schedulers.ScheduledDirectPeriodicTask.run(ScheduledDirectPeriodicTask.java:38)
                                                             at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
                                                             at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:278)
                                                             at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:154)
                                                             at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:270)
                                                             at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                             at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                             at java.lang.Thread.run(Thread.java:818)

Actual result

App crashes on start

Expected result

App does not crash on start

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Reactions: 2
  • Comments: 25 (10 by maintainers)

Commits related to this issue

Most upvoted comments

Calling onSubscribe is mandatory in RxJava 2.x. Also the preferred way of creating bridges to no-rx sources is Observable.create() which has safeguards guarding against this type of mistakes.

I’m seeing this issue with RxJava 2.1.11 (https://github.com/ReactiveX/RxJava/commit/8a6bf14fc9a61f7c1c0016ca217be02ca86211d2) this commit changed how the queue is initialized. For now, I suggest staying with RxJava 2.1.10. I’ll try to find out why it happens and submit an issue to RxJava repo.