首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJava单间错误处理问题

RxJava单间错误处理问题
EN

Stack Overflow用户
提问于 2018-10-28 10:41:20
回答 1查看 2.7K关注 0票数 4

我有这个问题的空数据库返回房间和RxJava单。我知道我的数据库是空的,所以我希望在触发时得到一个空的返回

代码语言:javascript
复制
@Query("SELECT * FROM Times WHERE timestamp = :timestamp")
fun getTimes(timestamp: String): Single<Times>

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

代码语言:javascript
复制
timeDao.getTimes("1398332113")
       .observeOn(AndroidSchedulers.mainThread())
       .subscribeOn(Schedulers.io())
       .doOnError { Log.e("Single", "Returned null") }
       .doOnSuccess { result -> times = result}
       .subscribe()

订阅者实际上正在调用doOnError方法,如

E/Single:返回null

但仍返回异常和崩溃

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

查询返回空结果集: SELECT * FROM timestamp =?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-29 01:32:30

首先是你的问题的解决方案。从版本开始,2.1.0-alpha01房间支持Maybe返回类型,它非常适合建模您的问题。

documentation

可能使用以下顺序协议运行:onSubscribe (onSuccess | onError | onComplete)?

当您的项目在db中时,将使用数据调用onSuccess。如果db为空,将调用onCompleteonError是不言自明的。

在Dao类中用Maybe替换Single是可行的。

进一步说明:

代码语言:javascript
复制
timeDao.getTimes("1398332113")
       .observeOn(AndroidSchedulers.mainThread())
       .subscribeOn(Schedulers.io())
       .doOnError { Log.e("Single", "Returned null") }
       .doOnSuccess { result -> times = result}
       .subscribe()

doOnError

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值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53027950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档