我正在使用 Maybe 访问数据库,我的目标是在 Maybe 完成时调用网络,表明数据库中没有数据(我正在使用房间)。我有以下功能:
@Override
public Observable<List<Item>> getResults() {
return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
}
@Override
public Observable<List<Item>> getResultsFromNetwork() {
System.out.println("getting results from network");
return api.getData().doOnNext(new Consumer<List<Item>>() {
@Override
public void accept(List<Item> items) throws Exception {
itemDao.insert(items);
}
});
}
@Override
public Maybe<List<Item>> getResultsFromDatabase() {
System.out.println("getting coins from database");
return itemDao.getAllItems();
}
但是,switchIfEmpty 的工作有点出乎意料,因为它总是被调用,即使数据库中有对象也是如此。
return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
- 是否可以仅使用 toObservable() 将 Maybe 转换为 Observable?
- 是否有另一种方法来检查 Maybe 是否为空然后对其执行操作?
最佳答案
使用 Single
而不是 Maybe
.因为当数据库中没有行时,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();
}
});
}
关于android - Rxjava - 如何正确检查 Maybe/Observable 是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646991/