在 Retrofit + RxJava 中链接请求

Chaining requests in Retrofit + RxJava

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

首先我想向 API A 发出请求并将其数据存储在 SQL table a 中。然后向 API B 发出请求,并将其数据存储在 table b 中,并将一些数据存储在 table 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 函数,这看起来会像普通的嵌套调用一样难看。这是更好的方法吗?

是的,您可以使用平面图来达到这个目的。请参阅以下示例(假设您的服务 A returns Observable<FooA> 和服务 B returns 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

             }
        });

我不认为使用 map 运算符是处理诸如存储 api 调用结果之类的事情的最佳方式。

我喜欢做的是将 doOnNext 运算符中的那些东西分开。所以你的例子是这样的:

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

(自己添加必要的 observeOnsubscribeOn,完全按照您的需要添加)