2016-11-29 70 views
2

我需要约5个链接请求例如我有5个不同的调用,我想让他们串行不按特定顺序并行。链接请求与改造和rxjava

这里是我的观测

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()); 

的一些例子其实,我不知道是什么功能做它的Java RX。

早先我实现了并行请求,现在我需要串行。

如果您在此处需要并行方法你:

Observable<ResponseResult> combined = Observable.zip(textsCall, routesCall, (textsBody, airportCombo) -> { 
      //some parsing and other logic 
      return new ResponseResult(flag); 
     }); 
+2

通常会使用'flatMap()'来链请求这样的..特别是在打第二个电话时需要第一个电话的结果。 –

回答

7

可以使用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 

    } 
}); 
+0

谢谢,我赞赏 –

+0

doOnNext方法怎么样呢? (modelA→db.store(modelA)) .doOnNext(modelA→db.store(modelA)) .flatMap(modelA→apiService.B()) .doOnNext(modelB→db.store(modelB)); –

+0

任何想法如何在这里处理错误? –