RxJava:使用Builder对象链接Observables

时间:2017-02-07 03:25:18

标签: java android rx-java

我使用Builder模式构建模型对象,该模型对象组合了来自不同网络调用的数据,并且我很难理解从第一次网络调用中获取模型对象的最佳方法。将第二次网络调用的数据合并到原始模型对象中。

我的实际订阅:

myFirstApiRepository.getFirstModelObjectBuilder()
    .flatmap(firstModelObjectBuilder -> mySecondApiRepository.getSomeExtraData(firstModelObjectBuilder))
    .observable.subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(getMySubscriber());

第一次网络电话:

public Observable<FirstModelObject.Builder> getFirstModelObjectBuilder() {
    return myFirstApiResource.getSomeData(...)
            .flatMap(someData -> Observable.just(new FirstModelObject.Builder()
                .setFirstAttribute(someData.getFirstAttribute())
                .setSecondAttribute(someData.getSecondAttribute())));
}

第二次网络电话:

public Observable<FirstModelObject> getSomeExtraData(FirstModelObject.Builder builder) {
    return mySecondApiResource.getSomeData(...)
        .flatMap(aString -> builder.setSomeStringValue(aString)
                                   .build());
}

这里的问题是我必须将构建器对象传递给第二个网络调用的可观察对象。这使得它非常严格,我宁愿不让我的SecondApiRepository依赖并引用它不应该引用的数据类型。这也是第二种方法&#34; .build()&#34;对象,这是不好的。 那么,如何使用firstModelObject并以干净的方式从第二次网络通话中添加数据

如果这只是糟糕的设计,请告诉我。我还在尝试了解有关RxJava最佳实践的更多信息。 :)

1 个答案:

答案 0 :(得分:1)

如果您的第二个请求依赖于第一个请求的结果,请检查我的回答 - https://stackoverflow.com/a/41820372/7045114

如果不是 - 只需使用zip运算符:

  

通过指定的函数将多个Observable的排放组合在一起,并根据此函数的结果为每个组合发出单个项目。

Observable.zip(firstRequest, secondRequest, (firstResult, secondResult) -> {
    //process results
})