【问题标题】:Retrofit 2 + RxJava StackOverflowError on Android 7Android 7 上的改造 2 + RxJava StackOverflowError
【发布时间】:2017-08-22 07:03:41
【问题描述】:

我在 Crashlytics 中看到一些错误,仅适用于与 Retrofit 2 和 RxJava 1 相关的 Android 7。根本没有提及任何应用程序代码。设备尚未植根,应用程序大多不集中。到目前为止,在我的任何设备上都没有复制过。

堆栈跟踪如下:

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)

问题不是特定于供应商的(三星、摩托罗拉、华为等)。有什么想法吗?

【问题讨论】:

  • 显示您的代码,似乎您无限调用取消订阅(可能在 onError 时?)
  • 代码库很大,无法真正将问题定位到代码的特定部分:(
  • 不能准确地说出任何事情,但这里有几点可能会有所帮助:首先,当您使用不正确的退出代码进行递归调用时,通常会发生 SO 错误。其次,我建议处理初始错误以获取源代码。

标签: android rx-java retrofit2 android-7.0-nougat android-7.1-nougat


【解决方案1】:

根据堆栈跟踪,您似乎有非常嵌套的 merge 运算符。有没有地方可以使用 Observables 集合并做类似的事情

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

或类似的东西(可能通过.scan())?

【讨论】:

  • 您的建议提示我查看其中包含分页的后端请求之一。它里面有 merge 和 flatMap 。看起来服务器以一种导致无限请求循环的方式响应。虽然我无法确认这是否会导致主题错误,但我必须说谢谢你提示我。如果确实是这样,我会接受你的回答。
猜你喜欢
  • 2017-10-15
  • 1970-01-01
  • 2016-12-17
  • 1970-01-01
  • 2015-03-06
  • 2018-01-17
  • 1970-01-01
  • 2016-06-28
  • 2018-10-05
相关资源
最近更新 更多