在Retrofit + RxJava中链接请求

时间:2016-04-22 04:52:30

标签: android rx-java retrofit2

我有两个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;
        });
    });

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

2 个答案:

答案 0 :(得分:22)

我不认为使用map运算符是存储api调用结果等内容的最佳方式。

我喜欢做的是将doOnNext运算符中的内容分开。所以你的例子是这样的:

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

(自己添加必要的observeOnsubscribeOn,就像您需要的那样)

答案 1 :(得分:21)

是的,您可以将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

             }
        });
相关问题