2016-04-22 151 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