致命例外:当触发器处置时,RxCachedThreadScheduler-1。 为什么?

我有以下RxJava 2代码(在Kotlin中),它有一个Observable

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}") }) 

虽然它仍然是Thread.sleep(2000) ,我执行disposable?.dispose()调用,它会出错

 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) 

我期望的dispose将有助于在默认情况下取消操作,或者至多在订阅上有错误。 但是,它只是按照上面的错误信息崩溃。

为什么异常逃脱? 是不是假设没有崩溃就默认取消整个操作?

这里有一个综合的因素:

  1. dispose使用subscribeOn的流也处理使用的线程。 这还涉及使用Schedulers.io()时调用Thread.interrupt() Schedulers.io() 。 这在你的情况下会导致异常。
  2. InterruptedException是由Thread.sleep引发的Exception ,所以它被您的代码捕获并像其他任何异常一样传递给onError
  3. dispose之后调用onError将错误重定向到全局错误处理程序,因为RxJava2的策略是从不丢弃错误。 要在调用onError之前检查subscriber.isDisposed()或使用RxJava 2.1.1的新subscriber.tryOnError

     if (!subscriber.isDisposed()) { subscriber.onError(exception) }