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)
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)
(添加必要的observeOn和subscribeOn你自己,完全像你需要它们)
| 归档时间: |
|
| 查看次数: |
14607 次 |
| 最近记录: |