【问题标题】:Android + RxJava - loading data from db AND web serviceAndroid + RxJava - 从数据库和网络服务加载数据
【发布时间】:2015-02-23 04:48:36
【问题描述】:

我想使用 RxJava 从 Web 服务加载数据(通过 Retrofit)。我也有以前结果的数据库缓存。

假设我已经有每个这些的 observables:

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

我想将这两个 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);
            }
        });
    }
}

这对我来说似乎有点 hacky,我觉得对于这种常见的情况,必须有更好的解决方案。

如果网络 observable 发生错误,db 结果仍然可以通过,这也很好。我可以调用 onErrorResumeNext() 并返回 dbObservable 本身,但我仍然希望通知订阅者发生错误。

有什么建议吗?

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

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

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

    【讨论】:

    • 嗯,这看起来非常明显!我使用mergeDelayError() 来确保两个可观察对象都有机会返回。非常感谢!
    • 除此之外,mergeDelayError 将帮助您获得所需的错误行为。如果其中一个流出现错误,在完成之前不会影响另一个流,之后您可以使用任何您喜欢的错误运算符来处理错误。
    • @lopar 非常好。还值得看看mergemergeDelayError 的大理石图以正确理解reactivex.io/documentation/operators/merge.html
    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多