3

假设我有 2 个 Observable(A 和 B),它们本质上是网络调用(使用 Retrofit 提供上下文)。

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

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

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

  1. 我想立即知道 Observable A 何时完成
  2. 我想立即知道 Observable B 何时完成
  3. 我想知道两者什么时候完成

首先,这是 RxJava 的一个很好的用例吗?

我知道如何单独执行每个场景(zip用于最后一个场景),尽管我不知道如何同时完成所有场景。

如果我订阅 Observable A,A 就开始了。如果我订阅 B,则 B 开始。如果 A & B 在我订阅 zip(a, b) 之前完成,我可能会错过这个活动并且永远不会真正看到这个完成,对吧?

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

4

1 回答 1

5

您可以使用三个不同的 observable 来实现这一点,每个案例一个。

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

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 方法之间共享对象,否则您将不得不处理并发问题。

于 2014-12-10T09:30:59.973 回答