致命例外:当触发器处置时,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
将有助于在默认情况下取消操作,或者至多在订阅上有错误。 但是,它只是按照上面的错误信息崩溃。
为什么异常逃脱? 是不是假设没有崩溃就默认取消整个操作?
这里有一个综合的因素:
-
dispose
使用subscribeOn
的流也处理使用的线程。 这还涉及使用Schedulers.io()
时调用Thread.interrupt()
Schedulers.io()
。 这在你的情况下会导致异常。 -
InterruptedException
是由Thread.sleep
引发的Exception
,所以它被您的代码捕获并像其他任何异常一样传递给onError
。 -
在
dispose
之后调用onError
将错误重定向到全局错误处理程序,因为RxJava2的策略是从不丢弃错误。 要在调用onError
之前检查subscriber.isDisposed()
或使用RxJava 2.1.1的新subscriber.tryOnError
。if (!subscriber.isDisposed()) { subscriber.onError(exception) }