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

时间:2014-12-09 23:13:49

标签: android retrofit rx-java rx-android

假设我有两个基本上是网络调用的Observables(A& B)(使用Retrofit来提供上下文)。

该应用程序的当前流程如下:

  • A& B大约在同一时间(异步)开始。
  • B在用户交互时执行0次或更多次

考虑到这2个observables / api调用,我想听3种不同的场景。

  1. 我想在Observable A完成时立即知道
  2. 我想在Observable B完成时立即知道
  3. 我想知道两者何时完成
  4. 首先,这是RxJava的一个很好的用例吗?

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

    如果我订阅Observable A,A开始。如果我订阅B,B就开始了。如果A& B在我订阅zip(a,b)之前完成,我可能会错过这个活动,从来没有真正看到这个完整,对吗?

    任何一般指导将不胜感激。我的RxJava知识非常薄:P

1 个答案:

答案 0 :(得分:5)

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

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

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

不要在onCompleted方法之间共享对象,否则你将不得不处理并发问题。