我正在使用Maybe访问数据库,我的目标是调用网络,如果Maybe将完成,表明数据库中没有数据(我正在使用房间)。我有以下功能:
return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
但是,即使数据库中有对象,switchIfEmpty也会意外地工作,因为它总是被调用。
gradle.properties
答案 0 :(得分:4)
使用Single
代替Maybe
。因为当db中没有行时,Maybe
将直接完成而不会调用错误。但是,如果没有行,Single
将onError
与EmptyResultSetException
结果。然后我们可以使用Rx的电源从网络呼叫返回数据。以下是:
首先更改您的itemDao.getAllItems()
以返回Single<List<Item>>
。
然后更改getResultsFromDatabase()
以返回Single
,例如:
@Override
public Single<List<Item>> getResultsFromDatabase() {
System.out.println("getting coins from database");
return itemDao.getAllItems();
}
现在您需要使用onErrorResumeNext
才能从网络电话中返回数据,因此请将getResults()
更改为:
@Override
public Observable<List<Item>> getResults () {
return getResultsFromDatabase()
.toObservable()
.onErrorResumeNext(new ObservableSource<List<Item>>() {
@Override
public void subscribe(io.reactivex.Observer<? super List<Item>> observer) {
getResultsFromNetwork();
}
});
}
答案 1 :(得分:0)
调用getResultsFromNetwork
的原因不是将其返回值传递给switchIfEmpty而不是其引用吗?
我会将其更改为例如
getResultsFromDatabase().toObservable().switchIfEmpty(Maybe.Callable(this::getResultsFromNetwork))
看看是否有帮助