RxJava - 组合 multiple/different 网络服务调用
RxJava - Combining multiple/different web service calls
我正在使用 Basecamp api 到 return 并显示待办事项列表。这是我目前正在做的一个例子:
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
是 return BcxToDoList
和 BcxToDos
Observables 的 Retrofit Web 服务调用。
在 fetchToDoLists
的订阅中,我遍历每个 BcxToDoList,调用 fetchToDos
并将我的 BcxToDo 对象附加到原始列表。
如您所见,它有点冗长。我可以将其分成两个语句以使其更具可读性。但是,这不是很 Rx。在 RxJava 中有没有不同的方法来做到这一点并提高其可读性?
我可以使用 lambda 来使它变得紧凑,但在这个阶段我更感兴趣的是我可以利用 RxJava 中的哪些特性。
你不应该 "break the chain" 在你的 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(...);
我正在使用 Basecamp api 到 return 并显示待办事项列表。这是我目前正在做的一个例子:
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
是 return BcxToDoList
和 BcxToDos
Observables 的 Retrofit Web 服务调用。
在 fetchToDoLists
的订阅中,我遍历每个 BcxToDoList,调用 fetchToDos
并将我的 BcxToDo 对象附加到原始列表。
如您所见,它有点冗长。我可以将其分成两个语句以使其更具可读性。但是,这不是很 Rx。在 RxJava 中有没有不同的方法来做到这一点并提高其可读性?
我可以使用 lambda 来使它变得紧凑,但在这个阶段我更感兴趣的是我可以利用 RxJava 中的哪些特性。
你不应该 "break the chain" 在你的 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(...);