如何通过使用RxJava-Android等待多个嵌套的异步调用?

前端之家收集整理的这篇文章主要介绍了如何通过使用RxJava-Android等待多个嵌套的异步调用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是Rx Java的新手,这是我的情况,

>发送请求A,并将获得列表< A>背部
>对于每个A,发送请求AA并将AA获得,绑定A和AA然后
>有B& BB具有相似的逻辑
>只有在所有请求完成后才能做某事

例:

request(url1,callback(List<A> listA) {
    for (A a : listA) {
        request(url2,callback(AA aa) {
            a.set(aa);
        }
    }
}

A和B是独立的

如何构建代码?我也用Retrofit作为网络客户端.

谢谢.

解决方法

好的,我想这应该解决你的问题的第一部分:

请注意,对flatMap的第二次调用给定了2个参数 – 有一个flatMap版本,它不仅为每个输入项产生一个Observable,而且还需要一个第二个函数,这个函数又将所得到的Observable中的每个项目与相应的输入项目.

看看这个标题下的第三个图形,以获得直观的理解:

https://github.com/ReactiveX/RxJava/wiki/Transforming-Observables#flatmap-concatmap-and-flatmapiterable

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);
    }

})
...

从这里开始,我仍然不确定你想继续下去:你准备好订阅了由此产生的可观察的?这样你可以处理每个As(onNext)或只是等到所有的完成(onCompleted).

附录:要将所有项目收集到单个列表中,那么可以将您的“可观察”< A>变成可观察的< List< A>>使用toList().

https://github.com/ReactiveX/RxJava/wiki/Mathematical-and-Aggregate-Operators#tolist

所以你有:

Observable<List<A>> observableOfListOfAs = observableOfAs.toList();

如果您需要对列表的构建进行更细粒度的控制,您还可以使用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!
    }
});

我想你可以猜测MyPairOfLists的定义.

猜你在找的Java相关文章