我正在使用Basecamp api返回并显示待办事项列表。以下是我目前正在做的一个示例:
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();
}
});
fetchToDoLists
和fetchToDos
是Retrofit Web服务调用,返回BcxToDoList
和BcxToDos
Observables。
在订阅fetchToDoLists
时,我遍历每个BcxToDoList,调用fetchToDos
并将我的BcxToDo对象附加到原始列表。
正如你所看到的,它有点冗长。我可以将它分成两个语句,使其更具可读性。但是,这不是很好的Rx。在RxJava中有不同的方法来提高它的可读性吗?
我可以使用lambdas来实现这个紧凑,但在这个阶段我更感兴趣的是我可以利用RxJava中的哪些功能。
答案 0 :(得分:1)
你不应该打破链条#34;在你的RxJava调用中,因此你需要flatMap来链接它们。 Observable.from()允许您将元素列表拆分为单独的Observable。接下来,您可以使用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(...);