Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.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 了解数据流和多个订户(使用改进)_Android_Retrofit_Rx Java_Rx Android - Fatal编程技术网

Android 了解数据流和多个订户(使用改进)

Android 了解数据流和多个订户(使用改进),android,retrofit,rx-java,rx-android,Android,Retrofit,Rx Java,Rx Android,假设我有两个观测值(A和B),它们本质上是网络调用(使用改装来提供上下文) 应用程序的当前流程如下所示: A和B大约同时启动(异步) B在用户交互时执行0次或更多次 我有3个不同的场景,在给定这2个可观察的/api调用的情况下,我想要监听它们 我想知道可观测A何时完成 我想知道可观测B何时完成 我想知道他们什么时候都完成了 首先,这是RxJava的一个好用例吗 我知道如何单独执行每个场景(最后使用zip),但我不知道如何同时执行所有场景 如果我同意可观测A,A开始。如果我订阅B,B开始。如果

假设我有两个观测值(A和B),它们本质上是网络调用(使用改装来提供上下文)

应用程序的当前流程如下所示:

  • A和B大约同时启动(异步)
  • B在用户交互时执行0次或更多次
我有3个不同的场景,在给定这2个可观察的/api调用的情况下,我想要监听它们

  • 我想知道可观测A何时完成
  • 我想知道可观测B何时完成
  • 我想知道他们什么时候都完成了
  • 首先,这是RxJava的一个好用例吗

    我知道如何单独执行每个场景(最后使用
    zip
    ),但我不知道如何同时执行所有场景

    如果我同意可观测A,A开始。如果我订阅B,B开始。如果A&B在我订阅zip(A,B)之前完成,我可能会错过活动,并且永远不会看到这个完成,对吗


    如能提供一般性指导,将不胜感激。我的RxJava知识非常贫乏:P

    您可以使用三种不同的可观察对象来实现这一点,每种情况一个

    由于您必须在每个可观测对象之间共享状态,因此您必须将改造后的冷可观测对象转换为热可观测对象。(有关此主题的更多信息,请参阅)


    不要在未完成的方法之间共享对象,否则您将不得不处理并发性问题。

    太棒了,这真的很有帮助。您是否介意对我可能遇到的并发性问题进行一些扩展?如果我观察到它们都在同一条线上,这仍然是一个问题吗?我认为A或B将首先完成,然后是A+B。可观测A、可观测B和可观测ab(A和B的合并可观测)可以在不同的线程中完成。因此,对未完成方法的调用不能是顺序的(与rx合同相反)。您可以在未完成的方法中读取名为“hello”的共享变量。下一行,再次读取相同的变量。值可以改变,因为来自另一个可观察对象的另一个未完成方法可以改变它。
    ConnectableObservable a = service.callA().publish(); 
    ConnectableObservable b = service.callB().publish();
    
    a.subscribe((e) -> { /* onNext */ }, (ex) -> {/* onError */},  () -> {/* when A is completed */ });
    b.subscribe((e) -> { /* onNext */ }, (ex) -> {/* onError */},  () -> {/* when B is completed */ });
    a.mergeWith(b).subscribe((e) -> { /* onNext */ }, (ex) -> {/* onError */},  () -> {/* when A and B are completed */ });
    
    a.connect(); // start subscription to a
    b.connect(); // start subscription to b