2016-11-29 14 views
2

たとえば、5つの呼び出しがあり、それらを特定の順序で並行しないようにするために、5つのチェーン要求を行う必要があります。ここでretrofitと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()); 

実は、私はRXのJava上でそれを何の機能かわからないされています。

以前のIVEは並列リクエストを実装しましたが、今はシリアルが必要です。

あなたがここに並列的なアプローチが必要な場合は、次のとおりです。

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

を機能をflatmap使用することができますが、通常、このようなチェーンの要求に 'flatMapを()'使用します。..とりわけ、第1の呼の結果が第2の呼を行うときに必要である場合。 –

答えて

7

あなたはこの正確な目的のために

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のアプローチはどうですか? .doOnNext(modelA - > db.store(modelA)) .flatMap(modelA - > apiService.B()) .doOnNext(modelB - > db.store(modelB)); –

+0

ここでエラーを処理する方法はありますか? –

関連する問題