2016-04-22 60 views
13

我有2個API,我想依次請求並將它們的數據存儲在SQLite中。Retrofit + RxJava中的鏈接請求

首先我要讓請求API A和存儲在SQL表a其數據。然後向API B發送請求並將其數據存儲在表b中,並將一些數據存儲在表a_b中。存儲在a_b中的數據僅來自請求B

我該如何使用RxJava來做到這一點。我在其他地方見過。如果我不使用lambda函數使用flatMap對於這一點,這樣的事情

apiService.A() 
    // store in DB here? How? maybe use map()? 
    .flatMap(modelA -> { 
     // or maybe store modelA in DB here? 
     return apiService.B().map(modelB -> { 
      storeInDB()l // store B here ? 
      return modelB; 
     }); 
    }); 

,這看上去就像正常的嵌套調用一樣醜陋。這是更好的方式嗎?

回答

13

我不認爲使用map運營商一起去之類的存儲API調用的結果的最佳方式。

我喜歡做的就是這些事情分開內部doOnNext運營商。所以,你的例子是這樣的:

apiService.A() 
     .doOnNext(modelA -> db.store(modelA)) 
     .flatMap(modelA -> apiService.B()) 
     .doOnNext(modelB -> db.store(modelB)); 

(添加必要observeOnsubscribeOn自己,就像你需要他們)

+0

我不知道Rx的運營商。閱讀完文檔後,是不是「doOnComplete」是一個更好的功能? – Sourabh

+0

@Sourabh它取決於你的'Observable'。如果在從api成功調用之後調用'onComplete',那麼是的。如果你的'Observable'可以發出多個事件,那麼你應該去'doOnNext'。在你的情況下('Retrofit'),使用'doOnNext'和'doOnComplete'將會得到相同的結果,但'doOnComplete'可能會更直觀一些(我使用純粹習慣中的'doOnNext')。 –

+0

我的意思是,用'doOnComplete',而不是'flatMap' – Sourabh

18

是的,您可以使用flatmap來達到這個確切目的。見下面的例子(假設您服務返回Observable<FooA>和服務B返回Observable<FooB>

api.serviceA() 
     .flatMap(new Func1<FooA, Observable<FooB>>() { 
      @Override 
      public Observable<FooB> call(FooA fooA) { 
       // code to save data from service A to db 

       // call service B 
       return api.serviceB(); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(new Subscriber<FooB>() { 
      @Override 
      public void onCompleted() { 
      } 

      @Override 
      public void onError(Throwable e) { 

      } 

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

      } 
     }); 
+0

如果我寫的代碼將數據保存到數據庫中onNext它將在主線程中運行對?如何將數據保存到後臺線程上的數據庫? –

+0

拋出另一個'flatMap'運算符。 api.serviceA()。flatMap((FooA) - > {// call service B})。flatMap((FooB) - > {//保存服務B的數據並返回一個可觀察的成功/失敗})。subscribeOn (Schedulers.io())observeOn(AndroidSchedulers.mainThread())doOnNext。((isSuccess) - > {//只有這樣才能在執行主線程})' –

+0

你怎麼會在RxJava2做到這一點? – Ryan