Search code examples
androidrx-javaretrofit2android-7.0-nougatandroid-7.1-nougat

Retrofit 2 + RxJava StackOverflowError on Android 7


I am seeing some errors in Crashlytics only for Android 7 related to Retrofit 2 and RxJava 1. No mentioning any app code at all. Devices has not been rooted and app mostly not in focus. On any of my devices this so far has not been reproduced.

Stacktrace is the following:

Fatal Exception: java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.Worker thread.
   at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:114)
   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.os.HandlerThread.run(HandlerThread.java:61)
Caused by java.lang.StackOverflowError: stack size 1037KB
   at rx.exceptions.Exceptions.throwIfAny(Exceptions.java:174)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:144)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.subscriptions.CompositeSubscription.unsubscribeFromAll(CompositeSubscription.java:186)
   at rx.subscriptions.CompositeSubscription.unsubscribe(CompositeSubscription.java:175)
   at rx.internal.util.SubscriptionList.unsubscribeFromAll(SubscriptionList.java:136)
   at rx.internal.util.SubscriptionList.unsubscribe(SubscriptionList.java:125)
   at rx.Subscriber.unsubscribe(Subscriber.java:98)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:820)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(OperatorMerge.java:276)
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.onError(OnSubscribeMap.java:88)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.onError(OperatorMerge.java:276)
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.onError(OnSubscribeMap.java:88)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:266)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
   at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
   at retrofit2.adapter.rxjava.OperatorMapResponseToBodyOrError$1.onError(OperatorMapResponseToBodyOrError.java:52)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:178)
   at rx.Subscriber.setProducer(Subscriber.java:211)
   at rx.Subscriber.setProducer(Subscriber.java:205)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
   at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
   at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
   at rx.Observable.unsafeSubscribe(Observable.java:10256)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248)
   at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:148)
   at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
   at rx.internal.util.ScalarSynchronousObservable$ScalarAsyncProducer.call(ScalarSynchronousObservable.java:200)
   at rx.internal.util.ScalarSynchronousObservable$2$1.call(ScalarSynchronousObservable.java:114)
   at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:107)
   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.os.HandlerThread.run(HandlerThread.java:61)

Issue is not vendor specific (Samsung, Motorola, Huawei etc). Any thoughts?


Solution

  • Based on the stack trace, you seem to be having extremely nested merge operators. Is there any place where you do work with a collection of Observables and do something like

    Iterator<Observable<T>> it = collection.iterator();
    Observable<?> obs = it.next();
    while(it.hasNext()) obs=obs.merge(it.next()); 
    

    or something equivalent (possibly via .scan())?