gpt4 book ai didi

java - 致命异常 : RxCachedThreadScheduler-1 when trigger dispose. 为什么?

转载 作者:行者123 更新时间:2023-11-30 06:47:59 25 4
gpt4 key购买 nike

我有以下 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 将有助于以静默方式取消操作,或者最多在订阅上使用 Log.e 捕获错误。然而,它只是按照上面的错误消息崩溃了。

为什么异常会逃逸? dispose 不是应该静默取消整个操作而不崩溃吗?

最佳答案

这里有多种因素:

    使用 subscribeOn 的流的
  1. dispose 也会释放所使用的线程。这还涉及在使用 Schedulers.io() 时调用 Thread.interrupt()。这会导致您的情况出现异常。
  2. InterruptedExceptionThread.sleep 抛出的 Exception,因此它会被您的代码捕获并传递给 onError 像任何其他异常一样。
  3. 由于 RxJava2 永不丢弃错误的政策,在 dispose 之后调用 onError 会将错误重定向到全局错误处理程序。要解决此问题,请在调用 onError 之前检查 subscriber.isDispose() 或使用 RxJava 2.1.1 的新 subscriber.tryOnError

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

关于java - 致命异常 : RxCachedThreadScheduler-1 when trigger dispose. 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45015104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com