【问题标题】:RxJava: application dies when exception is thrownRxJava:抛出异常时应用程序死亡
【发布时间】:2018-02-19 22:44:58
【问题描述】:

我试图在 Schedulers IO 线程中执行一些 IO 操作,如果抛出异常,我想向用户显示一些 Toast(当然是在 mainThread 中)。

为此,我使用以下代码:

 try {
        Observable.interval(0, 15, TimeUnit.SECONDS)
            .observeOn(Schedulers.io())
            .doOnNext(event -> failingNetworkOperation();)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnError(throwable -> 
                    Toast.makeText(MainActivity.this, "Error message", LENGTH_SHORT).show())
            .subscribe();

 } catch(Throwable t)  {
        //THIS CODE IS NEVER REACHED
        //BUT THE APPLICATION DIES.
        t.printStackTrace();
 }

当方法“failingInputOutputOperation”引发异常时,Throwable IS 被“doOnError”消费者捕获,但应用程序终止。

我将整个 sn-p 放在一个 try/catch 块中,但那里从未捕获到异常。

为什么应用程序会死掉,我该如何正确管理 RxJava 的错误? 非常感谢!

【问题讨论】:

  • 请编辑您的问题并发布与崩溃相关的整个 Java 堆栈跟踪。

标签: android rx-java reactive-programming rx-java2


【解决方案1】:

您的应用死机是因为您在 subscribe 中没有错误处理程序。把doOnError的回调放在那里:

    Observable.interval(0, 15, TimeUnit.SECONDS, Schedulers.io())
        .doOnNext(event -> failingNetworkOperation())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(items -> { }, 
             throwable -> 
                Toast.makeText(MainActivity.this, "Error message", LENGTH_SHORT).show()
        );

【讨论】:

  • 没错。非常感谢!所以 doOnError 不会消耗错误,它会一直向下游移动,直到“订阅”,对吧?为什么它没有在外部 try/catch 中被捕获?
  • try-catch 心态在异步世界中不起作用。 subscribe 是异步的,所以线程只是从 try-catch 中掉出来。
  • 好的,谢谢,我会考虑一下...我还看到“间隔”在错误后停止发出,那里发生了什么?是取消还是什么?
  • 是的。当doOnNext 崩溃时,序列被取消,包括间隔。
  • 我怎样才能避免它被取消?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 2018-02-22
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多