2016-11-29 150 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

任何想法如何在這裏處理錯誤? –