android - 了解数据流和多个订阅者(使用改造)

标签 android retrofit rx-java rx-android

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

应用当前流程如下:

  • A 和 B 几乎同时(异步)启动。
  • B 在用户交互中执行 0 次或多次

鉴于这 2 个可观察对象/api 调用,我有 3 种不同的场景需要监听。

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

首先,这是 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/

相关文章:

java - 预期为 BEGIN_ARRAY,但使用 Retrofit 后却为 BEGIN_OBJECT

java - 如何播放从内部存储中获取的歌曲

android - 未能向 <ip> 进行身份验证 |亚行无线网络

java - 无法为类 com.squareup.okhttp.ResponseBody 创建转换器

android - 如何读取纯文本/字符串而不是 JSON 的响应

python - RxPy - 为什么排放与合并运算符交错?

android - Observable.retrywhen 中的异常类型

java - RxJava : how to use Observable instead nested loops?

android - 如何在android中为按钮添加图像?

android - 在Android中获得控制权