【问题标题】:InterruptedException not caught on RxJava onError callback? [duplicate]RxJava onError 回调没有捕获到 InterruptedException? [复制]
【发布时间】:2019-08-25 12:52:43
【问题描述】:

下面有一个简单的代码

    compositeDisposable.add(Observable.create<Int> { Thread.sleep(1000) }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({}, {Log.d("Track", it.localizedMessage)}, {}))
    Handler().postDelayed({compositeDisposable.clear()}, 100)

它故意使用Thread.sleep(1000),只是为了触发InterruptedException。我故意延迟 100 毫秒,以确保链中的睡眠已经开始,并处理它。

(注意,我知道使用Thread.sleep 不是首选。我只是编写这段代码来测试并理解为什么在这种情况下不调用onError,以及如何在不需要使用的情况下优雅地防止崩溃RxJava 链中的 try-catch)

当时,当它被触发时,错误不是导致onError(即没有到达Log。而是抛出以下错误并使应用程序崩溃。

io.reactivex.exceptions.UndeliverableException: java.lang.InterruptedException
    at io.reactivex.plugins.RxJavaPlugins.onError(RxJavaPlugins.java:366)
    at io.reactivex.internal.operators.observable.ObservableCreate$CreateEmitter.onError(ObservableCreate.java:74)
    at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:43)
    at io.reactivex.Observable.subscribe(Observable.java:11194)
    at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
    at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:463)
    at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
    at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)
 Caused by: java.lang.InterruptedException
    at java.lang.Thread.sleep(Native Method)
    at java.lang.Thread.sleep(Thread.java:373)
    at java.lang.Thread.sleep(Thread.java:314)
    at com.elyeproj.porterduff.AnimateDrawPorterDuffView$startAnimate$1.subscribe(AnimateDrawPorterDuffView.kt:45)
    at io.reactivex.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:40)
    at io.reactivex.Observable.subscribe(Observable.java:11194) 
    at io.reactivex.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96) 
    at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:463) 
    at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66) 
    at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:764) 

为什么 InterruptedException 在 RxJava 中没有被 onError 捕获?

【问题讨论】:

标签: java exception kotlin rx-java2 thread-sleep


【解决方案1】:

根据@akarnokd 所指出的,在https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling 中,看起来 RxJava 在抛出之前已被处理,因此后来抛出的错误通过了。要解决这个问题只需要注册

 RxJavaPlugins.setErrorHandler { e -> /*Do whatever we need with the error*/ }

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2018-02-20
    • 2019-09-06
    • 2017-03-30
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多