Android RxJava使用zip链接多个调用
我试图从一系列API调用中构造一个可观察的对象,但我无法让它工作。我有四个API调用Android RxJava使用zip链接多个调用,android,rx-java,Android,Rx Java,我试图从一系列API调用中构造一个可观察的对象,但我无法让它工作。我有四个API调用ApiA,ApiB,ApiC和ApiD,它们使用RxJavaCallAdapterFactory返回可观测值ApiA和ApiB,然后在执行这两个命令之后,应调用ApiC和ApiD。执行最后两个后,视图被初始化。我正在使用zip操作符等待通话结束,我不确定这是正确的方法,但我对RxJava非常陌生,因此如果有其他更好的方法,请告诉我。 下面是我的代码,注释显示了我被卡住的地方 public Observable s
ApiA
,ApiB
,ApiC
和ApiD
,它们使用RxJavaCallAdapterFactory
返回可观测值<必须首先调用代码>ApiA和ApiB
,然后在执行这两个命令之后,应调用ApiC和ApiD。执行最后两个后,视图被初始化。我正在使用zip操作符等待通话结束,我不确定这是正确的方法,但我对RxJava
非常陌生,因此如果有其他更好的方法,请告诉我。
下面是我的代码,注释显示了我被卡住的地方
public Observable syncData() {
return Observable.zip(
// these two calls are executed
callApiA(),
callApiB(),
(o, o2) -> Observable.zip(
/* these two calls are not executed, it seems as if this zip has
no subscriber but i don't know why ... */
callApiC(),
callApiD(),
(o, o2) -> {
someLogic();
return Observable.empty();
}));
}
鉴于此,我只是接受了这种方法
viewModel.syncData().subscribe(
o -> mainAdapter.update(),
throwable -> throwable.printStackTrace()
);
同样,我对RxJava还是相当陌生的,因此我们将非常感谢您的帮助。谢谢你走对了方向 但是,请注意,
.zip
最后一个参数,Func
不是从它的调用
函数返回可观察的
,而是直接返回R
因此,您将可观察的
返回给订户的onNext
,而不是它的事件
flatMap
中间需要:
Observable.zip(callApi1(), callApi2(), Pair::new)
.flatMap((pair) -> Observable.zip(
Observable.just(pair.first()),
Observable.just(pair.second()),
callApiC(),
callApiD(),
(t1, t2, t3, t4) -> {
someLogic()
}));
这是伪代码,但我希望您能理解:
Zip
前两次通话(A、B)
返回从这些函数返回的对象的对
使用zip
操作符(使用flatMap
操作符)变换Pair
用接下来的2个调用(C、D)组成这对组合
从someLogic()
函数返回合成对象(记住,someLogic
应该返回R
,而不是可观察的
)
未来提示:
首先尝试在没有lambda表达式的情况下编写它。然后可以看到输入和输出参数,因此编写代码更容易。然后用lambda表达式重写它。重要的一点是,在订阅可观察对象之前,不会执行它们
因此,为了解释第一个可观察的发生了什么。zip
被赋予一个组合函数(callApiA(),callApiB())->Observable
,因此它产生了一个可观察的。
可观察对象作为元素发送,从不订阅
要修复它,您需要展平可观察流:observable.zip(…).flatmap(s->s)
。这会将流展平到Observable
,并订阅内部Observable。您确定调用没有在主线程上运行吗?为此,您可以在callApiX()
上添加.subscribeOn(Schedulers.io())
。你们有一些日志吗?所有的调用都在Schedulers.io()上,并没有错误或警告等待应答,但我仍然被困在同一个地方,前两个调用都被执行了,然后什么都并没有!这就是我要寻找的,我首先直接返回一个可观察的,然后使用flatMap解决了这个问题。谢谢