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) } 
  • Escuchar posts y escribir commands en un flujo observable
  • Confundido sobre la asignación de la variable RxJava
  • Asunto de RxJava: escuche el tipo diferente que el que emite
  • Problema de encadenamiento Completable after flatMapCompletable
  • ¿Cómo iterar sobre Single <List> y asignar a otra list?
  • Tipo de devolución diferente en RxJava 2 (actualización desde RxJava1)
  • Encadenando Observables para evitar suscripciones múltiples
  • Para una function de Kotlin utilizada como expresión, ¿hay una forma concisa de operar y devolver un valor?
  • consultas de múltiples dominios de Android con RXJava
  • JsonArray a la class de datos de Kotlin con Retrofit (se esperaba BEGIN_OBJECT pero era BEGIN_ARRAY)
  • Excepción: blockingConnect no se debe invocar en el subprocess UI a pesar de que subsubscribí en otro subprocess