代码之家  ›  专栏  ›  技术社区  ›  musooff

RxJava单人房错误处理问题

  •  0
  • musooff  · 技术社区  · 7 年前

    我有一个关于用Room和RxJava Single返回空数据库的问题。 我知道我的数据库是空的,所以我希望在触发时得到一个空的返回

    @Query("SELECT * FROM Times WHERE timestamp = :timestamp")
    fun getTimes(timestamp: String): Single<Times>
    

    问题是当我如下调用这个函数时

    timeDao.getTimes("1398332113")
           .observeOn(AndroidSchedulers.mainThread())
           .subscribeOn(Schedulers.io())
           .doOnError { Log.e("Single", "Returned null") }
           .doOnSuccess { result -> times = result}
           .subscribe()
    

    用户确实在呼叫 doOnError

    但仍然返回异常和崩溃

    W/System.err:io.reactivex.exceptions.OnErrorNotImplementedException: ?

    我在StackOverflow上看到过很多类似的问题,但是找不到答案。我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  4
  •   LordRaydenMK    7 年前

    首先是你的问题的解决方案。自版本 2.1.0-alpha01 Maybe 返回类型,这是完美的建模您的问题。

    documentation :

    onSubscribe (onSuccess | onError | onComplete)?

    当项目在数据库中时: onSuccess 将与数据一起调用。如果数据库为空 onComplete 将被调用。 onError

    更换 Single 在道课上会有用的。

    进一步说明:

    timeDao.getTimes("1398332113")
           .observeOn(AndroidSchedulers.mainThread())
           .subscribeOn(Schedulers.io())
           .doOnError { Log.e("Single", "Returned null") }
           .doOnSuccess { result -> times = result}
           .subscribe()
    

    doOnError 如果发生en错误,它将执行lambda,但它仍然会在链的下游发出错误。你的程序崩溃是因为它不能处理错误 subscribe() 是空的)。

    subscribe({/* doing nothing for success */}, {e -> Log.e("TAG", "Empty DB")}) 为了防止撞车。

    如果目标是在DB为空的情况下返回一些默认值,那么您将希望使用 onErrorReturn 这样链条才会继续。看一看 this blog post

    空值

    默认值不能为null,Reactive Streams规范(RxJava2实现它)不支持null值。