Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:使用Builder对象链接可观察对象_Java_Android_Rx Java - Fatal编程技术网

RxJava:使用Builder对象链接可观察对象

RxJava:使用Builder对象链接可观察对象,java,android,rx-java,Java,Android,Rx Java,我正在使用构建器模式来构建一个模型对象,该模型对象组合了来自不同网络调用的数据,我很难理解从第一个网络调用获取模型对象并将来自第二个网络调用的数据组合到原始模型对象中的最佳方法 我的实际订阅: myFirstApiRepository.getFirstModelObjectBuilder() .flatmap(firstModelObjectBuilder -> mySecondApiRepository.getSomeExtraData(firstModelObjectBuild

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

我的实际订阅:

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());
}
public可观测getFirstModelObjectBuilder(){
返回myFirstApiResource.getSomeData(…)
.flatMap(someData->Observable.just(新的FirstModelObject.Builder())
.setFirstAttribute(someData.getFirstAttribute())
.setSecondAttribute(someData.getSecondAttribute());
}
第二次网络呼叫:

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());
}
公共可观测getSomeExtraData(FirstModelObject.Builder){
返回mySecondApiResource.getSomeData(…)
.flatMap(aString->builder.setSomeStringValue(aString)
.build());
}
这里的问题是,我必须将builder对象传递到第二个网络调用的可观察对象中。这使得它非常严格,我不希望我的
SecondApiRepository
依赖并引用它不需要引用的数据类型。它还使这里的第二个方法“
.build()
”成为对象,这是不好的那么,如何使用
firstModelObject
并以干净的方式从第二次网络调用向其添加数据呢


如果这只是一个糟糕的设计,请让我知道。我仍在努力学习更多关于RxJava最佳实践的知识。:)

如果您的第二个请求依赖于第一个请求的结果,请检查我的答案-

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

通过指定函数将多个观测值的发射组合在一起,并根据此函数的结果为每个组合发射单个项目


在我的示例中,第一个请求返回一种类型的可观察对象,第二个请求返回另一种类型的可观察对象。我认为只有当两种数据类型相同时,链接答案才有效。如果我错了,请纠正我。它不依赖于可观察类型。FlatMap转换可观察对象,无论其类型如何。请仔细查看函数声明-例如,FlatMap需要
Func1I我现在看到了。我错误地试图在第二个函数/结果选择器中返回第二种类型的可观察对象。我应该把我的第二个字还给你。非常感谢你的帮助
zip
我觉得在这里是合适的方法-
mySecondApiResource.getSomeData(…)
将是
zip
的第二个可观察的
函数将执行
builder.setSomeStringValue(aString.build()