Android RxJava – 从db AND Web服务加载数据

我想使用Rx Java从Web服务加载数据(通过Retrofit).我还有一个以前结果的数据库缓存.

假设我已经有以下各项的可观察量:

Observable<List<MyModel>> networkObservable = retrofitService.getModels();
Observable<List<MyModel>> dbObservable = database.getModels();

我想将这两个observable合并为一个

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);
            }
        });
    }
}

这对我来说似乎有些苛刻,我觉得在这种常见情况下必须有更好的解决方案.

如果网络可观察的错误发生,那么db结果仍然会被传递,这也会很好.我可以调用onErrorResumeNext()并返回dbObservable本身,但我仍然希望通知订阅者发生错误.

有什么建议?

解决方法

直接使用Observable.merge.它将几个可观察的流合并为一个,因此如果数据库发出更快,您将首先接收它.
public static Observable<List<MyModel>> getModels() {
    return Observable.merge(dbObservable,networkObservable);
}

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...