EXCEPCIÓN FATAL: RxCachedThreadScheduler-1 cuando el gatillo se deshace. ¿Por qué?

Tengo el siguiente código RxJava 2 (en Kotlin), que tiene un Observable que

disposable = Observable.create<String>({ subscriber -> try { Thread.sleep(2000) subscriber.onNext("Test") subscriber.onComplete() } catch (exception: Exception) { subscriber.onError(exception) } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ result -> Log.d("Test", "Completed $result") }, { error -> Log.e("Test", "Completed ${error.message}") }) 

Mientras todavía está Thread.sleep(2000) , realizo la llamada disposable?.dispose() , se producirá un error

 FATAL EXCEPTION: RxCachedThreadScheduler-1 Process: com.elyeproj.rxstate, PID: 10202 java.lang.InterruptedException at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:371) at java.lang.Thread.sleep(Thread.java:313) at presenter.MainPresenter$loadData$1.subscribe(MainPresenter.kt:41) at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40) 

Supongo que la dispose ayudaría a cancelar la operación silenciosamente, o como máximo, Log.e que el error se encuentre con Log.e en la suscripción. Sin embargo, simplemente se bloquea según el post de error anterior.

¿Por qué escapó la Excepción? ¿No está dispuesto a cancelar toda la operación silenciosamente sin colgar?

Hay una combinación de factores aquí:

  1. dispose una secuencia que utiliza subscribeOn también desecha la cadena utilizada. Esto también implica llamar a Thread.interrupt() cuando se usa Schedulers.io() . Esto causa la exception en tu caso.
  2. InterruptedException es una Exception lanzada por Thread.sleep , por lo que su código la atrapa y pasa a onError como cualquier otra exception.
  3. Al onError after dispose networkingirige el error al controller de error global debido a la política de RxJava2 de NUNCA descartar errores. Para onError este check, subscriber.isDisposed() antes de llamar a onError o use el nuevo subscriber.tryOnError RxJava 2.1.1.

     if (!subscriber.isDisposed()) { subscriber.onError(exception) } 
  • ¿Cómo puedo fusionar una sola <Lista <Lista <T >>> en una Lista <T> con RxJava 2?
  • ¿Cómo se usa Flowable.generate de Kotlin?
  • Utilice la unidad de Kotlin (o cualquier otro object) escriba en el layout de Android
  • Kotlin: Cómo convertir la testing que usa Thread.sleep a RxJava TestScheduler
  • RxJava BehaviorSubject no emite el último elemento?
  • Excepción causada por: java.lang.ClassNotFoundException: org.reactivestreams.Publisher
  • Confundido sobre la asignación de la variable RxJava
  • llamar parte de la secuencia una vez con múltiples suscriptores?
  • ¿Comportamiento incorrecto de Maybe <List <T >> en Room?
  • El método de callback a menudo para reenviar el evento a Observable?
  • ¿Cómo especificar la versión de RxJava al usar RxKotlin?