在Retrofit + RxJava中链接请求

Sou*_*abh 19 android rx-java retrofit2

我有2个API,我想按顺序请求并将它们的数据存储在SQLite中.

首先,我想向API发出请求A并将其数据存储在SQL表中a.然后请求API B并将其数据存储在表中,b并将一些数据存储在表中a_b.存储的数据a_b仅来自请求B.

我怎么能用RxJava做到这一点.我在这里读到了关于使用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;
        });
    });
Run Code Online (Sandbox Code Playgroud)

如果我没有使用lambda函数,这看起来就像普通的嵌套调用一样难看.这是一个更好的方法吗?

Muc*_*low 22

是的,您可以将flatmap用于此目的.请参阅以下示例(假设您的服务A返回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

             }
        });
Run Code Online (Sandbox Code Playgroud)

  • 您将如何在RxJava2中做到这一点? (2认同)

Bar*_*ski 22

我不认为使用map运算符是最好的方式来存储api调用的结果.

我喜欢做的是将doOnNext运营商内部的东西分开.所以你的例子是这样的:

apiService.A()
        .doOnNext(modelA -> db.store(modelA))
        .flatMap(modelA -> apiService.B())
        .doOnNext(modelB -> db.store(modelB));
Run Code Online (Sandbox Code Playgroud)

(添加必要的observeOnsubscribeOn你自己,完全像你需要它们)