Android + RxJava - 从数据库和网络服务加载数据

标签 android rx-java rx-android

我想使用 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);
            }
        });
    }
}

这对我来说似乎有点老套,我觉得对于这种常见的情况一定有更好的解决方案。

如果网络可观察对象发生错误,数据库结果仍会通过,那也很好。我可以调用 onErrorResumeNext() 并返回 dbObservable 本身,但我仍然希望通知订阅者发生了错误。

有什么建议吗?

最佳答案

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

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

关于Android + RxJava - 从数据库和网络服务加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28667072/

相关文章:

android - 如何在 android 中成功登录 facebook 后重定向到应用程序?

android - 微调器值与文本?

java - RxJava2 Flowable zip 异步方法调用

java - 你如何链接多个可观察对象?

android - 迁移到 Android X 后应用程序崩溃 android.view.InflateException

android - 在 RxJava 中,如何启动从 API 生成的潜在无限事件流?

android - 使用 SQLBrite + Retrofit 刷新数据

java - 如何使用一个可观察值的状态来跳过另一个可观察值的值?

rx-java - 订阅(new Observer<T>()) vs 订阅(new Subscriber<T>()

Android Cursor - 连接/追加一个字符串