Krz*_*ski 2 android rx-java rx-java2 android-room
我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)
但是,即使数据库中存在对象,switchIfEmpty也会总是被意外地工作,因为它总是被调用。
return getResultsFromDatabase().toObservable().switchIfEmpty(getResultsFromNetwork());
Run Code Online (Sandbox Code Playgroud)
使用Single代替Maybe。因为当db中没有行时,Maybe将直接完成而不会调用错误。但是,当没有行时Single将导致。然后,我们可以使用Rx的功能从网络调用中返回数据。这是如何做:onErrorEmptyResultSetException
首先更改您itemDao.getAllItems()的退货Single<List<Item>>。然后更改getResultsFromDatabase()为return Single,如:
@Override
public Single<List<Item>> getResultsFromDatabase() {
System.out.println("getting coins from database");
return itemDao.getAllItems();
}
Run Code Online (Sandbox Code Playgroud)
现在您需要使用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();
}
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4978 次 |
| 最近记录: |