gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:35 26 4
gpt4 key购买 nike

我是 RxJava 的新手,这是我的案例,

  1. 发送请求A会得到List<A>返回
  2. 对每一个A,发送请求AA,会得到AA,然后绑定(bind)A和AA
  3. 有类似逻辑的B&BB
  4. 只有在所有请求完成后才做某事

例子:

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 的结果 Observable 了吗?这样您就可以处理每个 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();

如果您需要对列表的构造进行更细粒度的控制,您还可以使用 reduce .

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

对于 B,只需复制您用于 A 的整个流程。

然后您可以使用 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 的定义.

关于android - 如何使用 RxJava-Android 等待多个嵌套异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26356852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com