Android 使用改型和rxjava链接请求

Android 使用改型和rxjava链接请求,android,rx-java,Android,Rx Java,我需要做大约5个链接请求,例如,我有5个不同的调用,我想让它们按特定顺序串行而不是并行 下面是我观察到的一些例子 Observable<ResponseBody> textsCall=EndpointFactory.provideEndpoint().getTexts(textsTask.getLanguage()) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.ma

我需要做大约5个链接请求,例如,我有5个不同的调用,我想让它们按特定顺序串行而不是并行

下面是我观察到的一些例子

Observable<ResponseBody> textsCall=EndpointFactory.provideEndpoint().getTexts(textsTask.getLanguage())
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread());

Observable<AirportCombo> routesCall=EndpointFactory.provideEndpoint().getRoutes()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread());
Observable textsCall=EndpointFactory.providedendpoint().getTexts(textsTask.getLanguage())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
可观察的RouteCall=EndpointFactory.provideEndpoint().getRoutes()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread());
实际上,我不知道它在RXJava上有什么功能

前面我实现了并行请求,现在我需要串行请求

如果您需要并行方法,您可以:

Observable<ResponseResult> combined = Observable.zip(textsCall, routesCall, (textsBody, airportCombo) -> {
            //some parsing and other logic
            return new ResponseResult(flag);
        });
Observable combined=Observable.zip(textsCall,routesCall,(textsBody,airportCombo)->{
//一些语法分析和其他逻辑
返回新的ResponseResult(标志);
});

您可以使用flatmap功能实现这一目的

textsCall
 .flatMap(new Func1 < ResponseBody, Observable < AirportCombo >> () {
  @Override
  public Observable < AirportCombo > call(ResponseBody valueA) {
   // code to save data from service valueA to db
   // call service B
   return routesCall;
  }
 })
 .flatMap(new Func1 < AirportCombo, Observable < ValueC >> () {
  @Override
  public Observable < ValueC > call(AirportCombo valueB) {
   // code to save data from service valueB to db
   // call service C
   return observableC;
  }
 })
 .flatMap(new Func1 < ValueC, Observable < ValueD >> () {
  @Override
  public Observable < ValueD > call(ValueC valueC) {
   // code to save data from service valueC to db
   // call service D
   return observableD;
  }
 })
 .flatMap(new Func1 < ValueD, Observable < ValueFinal >> () {
  @Override
  public Observable < ValueFinal > call(ValueD valueC) {
   // code to save data from service valueD to db
   // call Final Service
   return observableFinal;
  }
 })
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(new Subscriber < ValueFinal > () {
  @Override
  public void onCompleted() {}

  @Override
  public void onError(Throwable e) {

  }

  @Override
  public void onNext(ValueFinal fooB) {
   // code to save data from service ValueFinal to db

  }
 });
textsCall
.flatMap(新函数1(){
@凌驾
公众可观察的呼叫(响应项值A){
//将数据从服务值A保存到数据库的代码
//呼叫服务B
返回路线呼叫;
}
})
.flatMap(新功能1>(){
@凌驾
公众可观察呼叫(机场组合valueB){
//将数据从服务值B保存到数据库的代码
//呼叫服务C
可观察的回报率;
}
})
.flatMap(新函数1>(){
@凌驾
公众可观察呼叫(ValueC ValueC){
//将数据从服务值C保存到数据库的代码
//呼叫服务D
可观察到的回报;
}
})
.flatMap(新函数1>(){
@凌驾
公众可观察调用(ValueD valueC){
//将数据从服务值保存到数据库的代码
//呼叫最终服务
返回可观察的最终结果;
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(新订户(){
@凌驾
已完成的公共void(){}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(价值最终fooB){
//将数据从service ValueFinal保存到db的代码
}
});

通常会使用
flatMap()
来链接这样的请求…特别是在进行第二次呼叫时需要第一次呼叫的结果时。谢谢,我很欣赏doOnNext方法。它可以吗。doOnNext(modelA->db.store(modelA)).flatMap(modelA->apiService.B()).doOnNext(modelB->db.store(modelB));“你知道如何处理这里的错误吗?”jenya doNext也没有issues@janya如果任何服务中出现任何错误,请输入一个错误