fif*_*fth 9 android asynchronous rx-java
我是RxJava的新手,这是我的情况,
List<A>返回例:
request(url1, callback(List<A> listA) {
for (A a : listA) {
request(url2, callback(AA aa) {
a.set(aa);
}
}
}
Run Code Online (Sandbox Code Playgroud)
A和B是独立的
如何构造代码?我还使用Retrofit作为网络客户端.
dav*_*ola 14
好的,我认为这应该可以解决问题的第一部分:
请注意,第二次调用flatMap给出了2个参数 - 有一个版本,flatMap它不仅为每个输入项生成一个Observable,而且还采用第二个函数,该函数又将结果Observable中的每个项与相应的输入项组合在一起.
请查看此标题下的第三个图形,以获得直观的理解:
Observable<A> obeservableOfAs = retrofitClient.getListOfAs()
.flatMap(new Func1<List<A>, Observable<A>>() {
@Override
public Observable<A> call(List<A> listOfAs) {
return Observable.from(listOfAs);
}
)}
.flatMap(new Func1<A, Observable<AA>>() {
@Override
public Observable<AA> call(A someA) {
return retrofitClient.getTheAaForMyA(someA);
}
},
new Func2<A, AA, A>() {
@Override
public A call(A someA, AA theAaforMyA) {
return someA.set(theAaforMyA);
}
})
...
Run Code Online (Sandbox Code Playgroud)
从这里开始,我仍然不确定你想如何继续:你准备好只订阅生成的Observable of As吗?这样你就可以处理每一个As(onNext)或者只是等到完成所有(onCompleted).
附录:要在最后将所有项目收集到一个列表中,这将使您Observable<A>成为一个Observable<List<A>>用途toList().
https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#tolist
所以你有了:
Observable<List<A>> observableOfListOfAs = observableOfAs.toList();
Run Code Online (Sandbox Code Playgroud)
如果您需要对列表的构造进行更精细的控制,您也可以使用reduce.
https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#reduce
对于B,只需复制用于As的整个流程.
然后,您可以使用zip等待两个流程完成:
Observable.zip(
observableOfListOfAs,
observableOfListOfBs,
new Func2<List<A>, List<B>, MyPairOfLists>() {
@Override
public MyPairOfLists call(List<A> as, List<B> bs) {
return new MyPairOfLists(as, bs);
}
}
)
.subscribe(new Subscriber<MyPairOfLists>() {
// onError() and onCompleted() are omitted here
@Override
public void onNext(MyPairOfLists pair) {
// now both the as and the bs are ready to use:
List<A> as = pair.getAs();
List<B> bs = pair.getBs();
// do something here!
}
});
Run Code Online (Sandbox Code Playgroud)
我想你可以猜出它的定义MyPairOfLists.
| 归档时间: |
|
| 查看次数: |
6120 次 |
| 最近记录: |