RxJava单人和会议室错误处理问题

时间:2018-10-28 02:41:20

标签: android exception-handling rx-java android-room rx-android

我遇到有关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方法,例如

  

E / Single:返回null

但仍然返回异常并崩溃

  

W / System.err:io.reactivex.exceptions.OnErrorNotImplementedException:   查询返回空结果集:SELECT * FROM Times WHERE timestamp =   ?

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

1 个答案:

答案 0 :(得分:1)

首先解决您的问题。由于public interface Observer { public void notifyUpdate(Contact contact); } public interface Observable { public void addObserver(Observer observer); } public class Detail extends JFrame implements Observable { /* multiple observers possible */ private ArrayList<Observer> observers; /* contact will be modified in detail-view and reported to overview-view */ private Contact contact; public Detail() { this.observers = new ArrayList<>(); } @Override public void addObserver(Observer observer) { this.observers.add(observer); } /* trigger this methode e.g. by save-button, after modifiing contact */ protected void notifyObservers() { /* multiple observers possible */ Iterator<Observer> observerIterator = this.observers.iterator(); while(observerIterator.hasNext()) { /* report observer: constact has modified */ observerIterator.next().notifyUpdate(contact); } } } public class Contacts extends JFrame implements Observer { private Detail detail; public Contacts() { detail = new Detail(); detail.setVisible(true); detail.addObserver(this); } @Override public void notifyUpdate(Contact contact) { /* notifyUpdate was called from Observable */ /* process contact, DB update, update JTable */ } } 版本的Room支持2.1.0-alpha01返回类型,因此非常适合对问题进行建模。

来自documentation

Maybe可以使用以下顺序协议进行操作:Maybe

当您的项目在数据库中时:onSubscribe (onSuccess | onError | onComplete)?将与数据一起调用。如果数据库为空,onSuccess将被调用。 onComplete不言自明。

在Dao类中将onError替换为Single即可。

更多说明:

Maybe

doOnError

timeDao.getTimes("1398332113") .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .doOnError { Log.e("Single", "Returned null") } .doOnSuccess { result -> times = result} .subscribe() 将在出现en错误的情况下执行lambda,但仍会沿链向下发出错误。您的程序由于不处理错误而崩溃(doOnError为空)。

您可以执行subscribe()来防止崩溃。

默认值

如果目标是在数据库为空的情况下返回一些默认值,则您将要使用subscribe({/* doing nothing for success */}, {e -> Log.e("TAG", "Empty DB")})以便链继续进行。看看this blog post了解更多信息。

空值

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