假设我有 2 个 Observable(A 和 B),它们本质上是网络调用(使用 Retrofit 提供上下文)。
应用当前流程如下:
- A 和 B 几乎同时(异步)启动。
- B 在用户交互中执行 0 次或多次
鉴于这 2 个可观察对象/api 调用,我有 3 种不同的场景需要监听。
- 我想立即知道 Observable A 何时完成
- 我想立即知道 Observable B 何时完成
- 我想知道两者何时完成
首先,这是 RxJava 的一个很好的用例吗?
我知道如何单独完成每个场景(最后使用 zip
),但我不知道如何同时完成所有这些场景。
如果我订阅 Observable A,A 就开始了。如果我订阅 B,B 开始。如果 A 和 B 在我订阅 zip(a, b) 之前完成,我可能会错过该事件并且永远不会真正看到它完成,对吧?
任何一般指导将不胜感激。我的 RxJava 知识很薄:P
最佳答案
您可以使用三种不同的 Observable 来实现这一点,每种情况一个。
由于您必须在每个 observable 之间共享状态,因此您必须将改造冷 observable 转换为热 observable。 (有关此主题的更多信息,请参阅 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 方法之间共享对象,否则您将不得不处理并发问题。
关于android - 了解数据流和多个订阅者(使用改造),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27390627/