Android + RxJava - 从数据库和网络服务加载数据
Android + RxJava - loading data from db AND web service
我想使用 RxJava 从 Web 服务加载数据(通过 Retrofit)。我还有以前结果的数据库缓存。
假设我已经对其中的每一个都进行了观察:
Observable<List<MyModel>> networkObservable = retrofitService.getModels();
Observable<List<MyModel>> dbObservable = database.getModels();
我想将这 2 个 observables 合并为一个:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
// TODO: Help!
}
}
我想要的行为是让订阅者尽快接收数据库结果,然后在它们进来时接收 restService 结果(假设从数据库中获取比进行网络调用更快)
我自己能想到的最好的是:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
List<MyModel> emptyList = new LinkedList<>();
// 'startWith' because combineLatest wont call back until all source observables emit something
Observable.combineLatest(dbObservable.startWith(emptyList),
networkObservable.startWith(emptyList),
new Func2<List<MyModel>, List<MyModel>, List<MyModel>>() {
@Override
public List<MyModel> call(List<MyModel> first, List<MyModel> second) {
return merge(first, second);
}
});
}
}
这对我来说似乎有点老套,我觉得对于这种常见的情况一定有更好的解决方案。
如果 network observable 中发生错误,数据库结果仍然会通过,那也很好。我可以调用 onErrorResumeNext()
和 return dbObservable 本身,但我仍然希望通知订阅者发生了错误。
有什么建议吗?
直接使用Observable.merge
。它将多个可观察流合并为一个,因此如果数据库发出速度更快,您将首先收到它。
public static Observable<List<MyModel>> getModels() {
return Observable.merge(dbObservable, networkObservable);
}
我想使用 RxJava 从 Web 服务加载数据(通过 Retrofit)。我还有以前结果的数据库缓存。
假设我已经对其中的每一个都进行了观察:
Observable<List<MyModel>> networkObservable = retrofitService.getModels();
Observable<List<MyModel>> dbObservable = database.getModels();
我想将这 2 个 observables 合并为一个:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
// TODO: Help!
}
}
我想要的行为是让订阅者尽快接收数据库结果,然后在它们进来时接收 restService 结果(假设从数据库中获取比进行网络调用更快)
我自己能想到的最好的是:
public class MyModelHelper {
public static Observable<List<MyModel>> getModels() {
List<MyModel> emptyList = new LinkedList<>();
// 'startWith' because combineLatest wont call back until all source observables emit something
Observable.combineLatest(dbObservable.startWith(emptyList),
networkObservable.startWith(emptyList),
new Func2<List<MyModel>, List<MyModel>, List<MyModel>>() {
@Override
public List<MyModel> call(List<MyModel> first, List<MyModel> second) {
return merge(first, second);
}
});
}
}
这对我来说似乎有点老套,我觉得对于这种常见的情况一定有更好的解决方案。
如果 network observable 中发生错误,数据库结果仍然会通过,那也很好。我可以调用 onErrorResumeNext()
和 return dbObservable 本身,但我仍然希望通知订阅者发生了错误。
有什么建议吗?
直接使用Observable.merge
。它将多个可观察流合并为一个,因此如果数据库发出速度更快,您将首先收到它。
public static Observable<List<MyModel>> getModels() {
return Observable.merge(dbObservable, networkObservable);
}