在 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));
(自己添加必要的 observeOn
和 subscribeOn
,完全按照您的需要添加)
我有 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));
(自己添加必要的 observeOn
和 subscribeOn
,完全按照您的需要添加)