使用RxJava的Android室处理空的查询结果

尝试使用RxJava适配器测试新的Android Room Librarty。 我想处理结果,如果我的查询从DB返回0对象:

所以这里是DAO方法:

@Query("SELECT * FROM auth_info") fun getAuthInfo(): Flowable<AuthResponse> 

而我如何处理它:

  database.authDao().getAuthInfo() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .switchIfEmpty { Log.d(TAG, "IS EMPTY") } .firstOrError() .subscribe( { authResponse -> Log.d(TAG, authResponse.token) }, { error -> Log.d(TAG, error.message) }) 

我的数据库是空的,所以我期望.switchIfEmty()工作,但没有任何处理方法正在发射。 .subscribe()和.switchIfEmpty()

Db Flowables是可观察的(所以如果数据库发生变化,它们会一直调度),所以它永远不会完成。 您可以尝试返回List<AuthResponse> 。 我们考虑过移植一个可选项,但决定不这样做,至少现在是这样。 相反,我们可能会在不同的已知库中添加对可选的支持。

switchIfEmpty作为参数Publisher<AuthResponse> 。 通过SAM转换你的匿名函数变成这个类。 但是,它不符合预期从Publisher的行为,因此它不会按预期工作。

用一个像Flowable.empty().doOnSubscribe { Log.d(TAG, "IS EMPTY") }这样的正确实现替换它Flowable.empty().doOnSubscribe { Log.d(TAG, "IS EMPTY") }它应该可以工作。

在版本1.0.0-alpha5中,room增加了对MaybeSingle支持,所以现在你可以写类似的东西了

 @Query("SELECT * FROM auth_info") fun getAuthInfo(): Maybe<AuthResponse> 

你可以在这里阅读更多