trello-archive/RxLifecycle

Fatal Exception: java.util.concurrent.CancellationException

Closed this issue · 5 comments

Fatal Exception: java.util.concurrent.CancellationException
at io.reactivex.internal.operators.single.SingleTakeUntil$TakeUntilOtherSubscriber.onNext(SingleTakeUntil.java:150)
at io.reactivex.internal.subscriptions.DeferredScalarSubscription.complete(DeferredScalarSubscription.java:133)
at io.reactivex.internal.operators.single.SingleToFlowable$SingleToFlowableObserver.onSuccess(SingleToFlowable.java:63)
at io.reactivex.internal.operators.observable.ObservableElementAtSingle$ElementAtObserver.onNext(ObservableElementAtSingle.java:91)
at io.reactivex.internal.operators.observable.ObservableFilter$FilterObserver.onNext(ObservableFilter.java:52)
at io.reactivex.internal.operators.observable.ObservableOnErrorReturn$OnErrorReturnObserver.onNext(ObservableOnErrorReturn.java:66)
at io.reactivex.internal.operators.observable.ObservableCombineLatest$LatestCoordinator.drain(ObservableCombineLatest.java:242)
at io.reactivex.internal.operators.observable.ObservableCombineLatest$LatestCoordinator.combine(ObservableCombineLatest.java:195)
at io.reactivex.internal.operators.observable.ObservableCombineLatest$CombinerObserver.onNext(ObservableCombineLatest.java:312)
at io.reactivex.internal.operators.observable.ObservableSkip$SkipObserver.onNext(ObservableSkip.java:53)
at io.reactivex.internal.operators.observable.ObservableRefCount$ConnectionObserver.onNext(ObservableRefCount.java:169)
at io.reactivex.internal.operators.observable.ObservablePublish$PublishObserver.onNext(ObservablePublish.java:233)
at io.reactivex.internal.util.NotificationLite.accept(NotificationLite.java:246)
at io.reactivex.subjects.BehaviorSubject$BehaviorDisposable.test(BehaviorSubject.java:490)
at io.reactivex.subjects.BehaviorSubject$BehaviorDisposable.emitNext(BehaviorSubject.java:485)
at io.reactivex.subjects.BehaviorSubject.onNext(BehaviorSubject.java:184)
at com.trello.rxlifecycle2.components.support.RxFragment.onPause(RxFragment.java:88)
at com.pockee.ui.profile.transaction.TransactionFragment.onPause(TransactionFragment.java:197)
at android.support.v4.app.Fragment.performPause(Fragment.java:2368)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1357)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1528)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.FragmentManagerImpl.dispatchPause(FragmentManager.java:2902)
at android.support.v4.app.FragmentController.dispatchPause(FragmentController.java:234)
at android.support.v4.app.FragmentActivity.onPause(FragmentActivity.java:448)
at com.trello.rxlifecycle2.components.support.RxAppCompatActivity.onPause(RxAppCompatActivity.java:81)
at com.pockee.ui.base.BaseActivity.onPause(BaseActivity.java:200)
at com.pockee.ui.base.BasePermissionsActivity.onPause(BasePermissionsActivity.java:93)
at android.app.Activity.performPause(Activity.java:6390)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1312)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3436)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3409)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3384)
at android.app.ActivityThread.access$1100(ActivityThread.java:163)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5585)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

dlew commented

This is how RxLifecycle works for Single and Completable. Read more here: https://github.com/trello/RxLifecycle/tree/2.x#unsubscription

Im sorry but I don't get it, what do I need to do and add to avoid this exception ?

dlew commented

If you need to avoid the exception, don't use RxLifecycle (and instead manually call unsubscribe() on the subscriber).

Thanks for your reply

Also, you may apply onErrorResumeNext to check if the exception is of type CancellationException (I guess an RxLifecycle custom exception would have been nicer) to recover from it, otherwise just rethrow.

onErrorResumeNext(error -> {
  if (error instanceof CancellationException) return Single.never();
  return Single.error(error);
});