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

时间:2015-02-23 04:48:37

标签: android rx-java rx-android

我想使用RxJava从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本身,但我仍然希望通知订阅者发生错误。

有什么建议吗?

1 个答案:

答案 0 :(得分:13)

直接使用Observable.merge。它将几个可观察的流合并为一个,因此如果数据库发出的速度更快,您将首先收到它。

public static Observable<List<MyModel>> getModels() {
    return Observable.merge(dbObservable, networkObservable);
}