Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RxJava使用zip链接多个调用_Android_Rx Java - Fatal编程技术网

Android RxJava使用zip链接多个调用

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

我试图从一系列API调用中构造一个可观察的对象,但我无法让它工作。我有四个API调用
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解决了这个问题。谢谢