【问题标题】:Not able to handle error while using Flowable in Rxjava在 Rxjava 中使用 Flowable 时无法处理错误
【发布时间】:2018-10-05 14:17:36
【问题描述】:
Flowable.just(getSize())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .onExceptionResumeNext { Flowable.just(10) }
            .onErrorResumeNext(Flowable.just(10))
            .doOnError { throwable -> Logger.log("caught in doOnError") }
            .subscribe({ size -> showSizeOnUi(size) },
                    { throwable -> Logger.log("caught in onError") })

getSize() 函数会抛出 NullPointer 异常。

 private fun getSize(): Int {
    val path: String? = null
    return path!!.length  // attempts to call length on null string (path)
}

据我所知,如果 getSize() 抛出任何异常,则应将控制权交给 onExceptionResumeNext,然后它将返回 '10',并且该值应转到 onNext() "{ size -> showSizeOnUi(大小) }"。但在这种情况下,应用程序只会崩溃。 我可以通过任何后备机制来防止这种崩溃吗?

谢谢。

【问题讨论】:

标签: rx-java rx-java2


【解决方案1】:

@bob-dalgleish 解释说,Flowable.just(getSize()) 表达式将立即抛出 NPE。但是你可以推迟创建Flowable:

    Flowable.defer { Flowable.just(getSize()) }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .onExceptionResumeNext { Flowable.just(10) }
        .onErrorResumeNext(Flowable.just(10))
        .doOnError { throwable -> Logger.log("caught in doOnError") }
        .subscribe({ size -> showSizeOnUi(size) },
                { throwable -> Logger.log("caught in onError") })

现在Flowable.just(getSize()) 将在subscribe() 上调用,RxJava 能够捕获异常。

【讨论】:

  • 谢谢。延迟按我的意愿工作。但现在我使用 fromCallable{},因为我只想要一次可观察。
【解决方案2】:

表达式Flowable.just(getSize()) 将立即抛出NullPointerException,RxJava 没有机会捕捉它。

您需要用try {...} catch (...) {...} 块包围整个语句。

【讨论】:

  • 感谢您的解释。之前我使用的是 try catch 块。但现在我正在寻找一些处理异常的内置机制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2017-01-20
  • 2018-10-26
相关资源
最近更新 更多