Zip运算符RxJava android上的错误处理

Zip运算符RxJava android上的错误处理,android,rx-java,Android,Rx Java,我想要什么 我想打个电话 1将照片上载到服务器并返回上载链接的Web服务 2webservice通过1stwebservice保存返回的链接 我想把两个观测值结合起来,同时得到结果 我的怀疑 如果我的1stWeb服务成功启动并且2nd遇到错误(例如:网络错误、服务器错误等),会发生什么情况 我怎么能发现呢?然后只重试第二次webservice 我不能做的事 如果2nd一个Web服务失败,我无法重试这两个Web服务,因为我将为1stWeb服务发送重复的文件 我的代码 // Upload file

我想要什么

我想打个电话

1将照片上载到服务器并返回上载链接的Web服务

2webservice通过1stwebservice保存返回的链接

我想把两个观测值结合起来,同时得到结果

我的怀疑

如果我的1stWeb服务成功启动并且2nd遇到错误(例如:网络错误、服务器错误等),会发生什么情况

我怎么能发现呢?然后只重试第二次webservice

我不能做的事

如果2nd一个Web服务失败,我无法重试这两个Web服务,因为我将为1stWeb服务发送重复的文件

我的代码

// Upload file (photos,documents etc ):
@POST("some link")
@FormUrlEncoded
Observable<UploadFile> uploadFile(@FieldMap HashMap<String, Object> fields);

// Save link (photos,documents etc ):
@POST("some link")
@FormUrlEncoded
Observable<SaveLink> saveLink(@FieldMap HashMap<String, Object> fields);

// Upload file
Observable<UploadFile> observable = retrofitService.uploadFile(map);
        subscriptionUploadFile = observable.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<UploadFile>() {
                    @Override
                    public void onCompleted() {
                        CommonFunction.printDebug(TAG, "completed");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(UploadFile model) {

                    }
                });

                // Save link            
                Observable<SaveLink> observable = retrofitService.saveLink(map);
        subscriptionSaveLink = observable.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<SaveLink>() {
                    @Override
                    public void onCompleted() {
                        CommonFunction.printDebug(TAG, "completed");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(SaveLink model) {

                    }
                });
//上传文件(照片、文档等):
@帖子(“某些链接”)
@FormUrlEncoded
可观察的上传文件(@FieldMap HashMap fields);
//保存链接(照片、文档等):
@帖子(“某些链接”)
@FormUrlEncoded
可观察的存储链接(@FieldMap HashMap fields);
//上传文件
Observable-Observable=RefughtService.uploadFile(地图);
subscriptionUploadFile=observable.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
printDebug(标记“已完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(上传文件模型){
}
});
//保存链接
Observable-Observable=服务.saveLink(地图);
subscriptionSaveLink=observable.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
printDebug(标记“已完成”);
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(保存链接模型){
}
});

依赖延续通常通过
flatMap
完成,您可以将
重试
应用到第二个
可观察

uploadFile(map)
.subscribeOn(Schedulers.io())
.flatMap(file -> {
    map.put("URL", file.getURL());
    return saveLink(map).retry(10);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);

依赖延续通常通过
flatMap
完成,您可以将
重试
应用于第二个
可观察

uploadFile(map)
.subscribeOn(Schedulers.io())
.flatMap(file -> {
    map.put("URL", file.getURL());
    return saveLink(map).retry(10);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(...);

根据您的描述,不可能同时执行这两个调用,因为第二个调用取决于第一个调用的结果…如果1成功,而2失败,则只能重试2次?您可以在onNext()中从第一个调用第二个请求,具体取决于它的成功。如果第二个失败,您只需在onError方法中处理错误。这就是您想要的吗?根据您的描述,不可能同时执行这两个调用,因为第二个调用取决于第一个调用的结果…如果1成功,而2失败,则只能重试2次?您可以在onNext()中从第一个调用第二个请求,这取决于它的成功。如果第二个失败,您只需在onError方法中处理错误。这就是你想要的吗?这看起来像是分别调用两个Web服务。。。就像我调用第一个Web服务一样,一旦成功,我调用第二个Web服务正如前面提到的,你依赖第一个服务,在你从第一个服务得到结果之前,你不能调用第二个。好的,我明白了。在第一个Web服务成功后,我将调用第二个Web服务。谢谢你澄清我的问题。这看起来像是分别调用两个Web服务。。。就像我调用第一个Web服务一样,一旦成功,我调用第二个Web服务正如前面提到的,你依赖第一个服务,在你从第一个服务得到结果之前,你不能调用第二个。好的,我明白了。在第一个Web服务成功后,我将调用第二个Web服务。谢谢你把我的问题说清楚。