Android RxJava-组合多个/不同的web服务调用
我正在使用Basecamp api返回并显示待办事项列表。下面是我目前正在做的一个示例:Android RxJava-组合多个/不同的web服务调用,android,retrofit,rx-java,Android,Retrofit,Rx Java,我正在使用Basecamp api返回并显示待办事项列表。下面是我目前正在做的一个示例: bcxClient .fetchToDoLists() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List<BcxToDoList>>() { @Override public void call(Lis
bcxClient
.fetchToDoLists()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<BcxToDoList>>() {
@Override
public void call(List<BcxToDoList> bcxToDoLists) {
for( final BcxToDoList toDoList : bcxToDoLists ) {
bcxClient
.fetchToDos( toDoList.bucket.id )
.subscribeOn( Schedulers.io() )
.observeOn( AndroidSchedulers.mainThread() )
.subscribe( new Action1<List<BcxToDo>>() {
@Override
public void call(List<BcxToDo> bcxToDos) {
for( BcxToDo toDo : bcxToDos ) {
toDoList.toDos.add( toDo );
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
}
mLoremTextView.setText(bcxToDoLists.get(0).name);
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
bcxClient
.fetchtopolists()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@凌驾
公共作废调用(列表bcxToDoLists){
对于(最终BcxToDoList toDoList:BcxToDoList){
bcxClient
.fetchToDos(toDoList.bucket.id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新操作1(){
@凌驾
公共作废调用(列表bcxToDos){
for(BcxToDo toDo:bcxToDos){
toDoList.toDos.add(toDo);
}
}
},新行动1(){
@凌驾
公共无效呼叫(可丢弃可丢弃){
printStackTrace();
}
});
}
mLoremTextView.setText(bcxToDoLists.get(0.name));
}
},新行动1(){
@凌驾
公共无效呼叫(可丢弃可丢弃){
printStackTrace();
}
});
fetchToDoLists
和fetchToDos
是更新的web服务调用,它们返回BcxToDoList
和BcxToDos
可见值
在订阅fetchToDos
I循环浏览每个BcxToDoList时,调用fetchToDos
并将我的BcxToDo对象附加到原始列表
正如你所看到的,这有点冗长。我可以把它分成两条语句,让它更具可读性。但是,这不是很好。在RxJava中是否有不同的方法来实现这一点并提高其可读性
我可以使用lambdas来实现这一点,但在这个阶段,我更感兴趣的是我可以利用RxJava中的哪些功能。您不应该在RxJava调用中“断链”,因此您需要flatMap来链接它们。还可以使用Observable.from()将元素列表拆分为单独的可观察对象。接下来,您可以使用toList将元素返回到列表中。下面是一个例子:
bcxClient
.fetchToDoLists()
.flatMap(new Func1<List<BcxToDoList>, Observable<BcxToDoList>>() {
@Override
public Observable<BcxToDoList> call(List<BcxToDoList> bcxToDoLists) {
return Observable.from(bcxToDoLists);
}
})
.flatMap(new Func1<BcxToDoList, Observable<List<BcxToDo>>>() {
@Override
public Observable<List<BcxToDo>> call(BcxToDoList bcxToDoList) {
return bcxClient
.fetchToDos(bcxToDoList.bucket.id);
.map(new Func1<List<BcxToDo>, BcxToDoList>() {
@Override
public BcxToDoList call(List<BcxToDo> bcxToDos) {
bcxToDoList.toDos.addAll(bcxToDos);
return bcxToDoList;
}
});
}
})
.toList()
.subscribe(...);
bcxClient
.fetchtopolists()
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(列表BCxToDoList){
可观察的返回(BCxToDoList);
}
})
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(BcxToDoList BcxToDoList){
返回bcxClient
.fetchToDos(bcxToDoList.bucket.id);
.map(新函数1(){
@凌驾
公共bcxToDos调用(列表bcxToDos){
bcxToDoList.toDos.addAll(bcxToDos);
返回bcxtodolost;
}
});
}
})
托利斯先生()
.认购(……);
我是个新手,所以我真的帮不了你,但我想我会问-这对你有帮助吗?看到平面图是如何工作的帮助!对于bcxToDoList中的每个项目,我必须调用fetchToDos
(带有参数)。然后如何将每个bcxToDo添加到它们的相关bcxToDo列表中?我已经通过添加请求参数编辑了我的答案。我还删除了将列表拆分为单独的元素,但请仔细查看fetchToDos映射-我正在将响应映射到当前BcxToDoList,但也添加了已获取的列表