【问题标题】:RxJava wait for one observable with subscriber wait for another observable with other subscriberRxJava 等待一个订阅者的 observable 等待另一个订阅者的 observable
【发布时间】:2016-12-06 17:34:33
【问题描述】:

我一直在寻找这个问题,但找不到解决方案(或者我可能无法根据其他答案做出解决方案)。

我的问题是我需要找到一种方法来等待一个可观察对象(带有自己的订阅者)并等待另一个可观察对象(带有自己的订阅者)完成。

这是场景:

obs1 -> retryWith(tokenAuthenticator) ->subscriber1 -> 更新 UI

obs2 -> 需要等待obs1获取新token -> 订阅者2 -> 更新界面

我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否使用新的会话令牌完成。也许这不是 RxJava 的主要目的。

Obs1 连接到一个 HTTP 连接并获取一个 Json,其中包含要填充 UI 的数据,而 obs2 也是如此,但还有其他 json 和其他信息要填充 UI。

对我来说唯一的问题是我的会话令牌每 5 分钟过期一次,当我尝试获取新令牌时,obs2 已经使用过期的会话令牌进行调用。

简单的解决方案是在 onComplete() 订阅者1 中执行 obs2,但我知道它必须是更好的解决方案,使用 RxJava。

【问题讨论】:

  • Rxjava 为您提供了各种可以帮助您的运算符,您可以尝试使用这些运算符,例如。重试、重试时间、去抖动等
  • 如果问题仅出现在令牌刷新中,那么您可以尝试来自 okhttp 客户端的原生 Authenticator 我在其他问题中描述了它:stackoverflow.com/questions/40762911/…

标签: android rx-java reactive-programming rx-android


【解决方案1】:

查看zip,它将允许您组合两个可观察对象的结果(如果您愿意,可以并行运行)。这是一个例子:

obs1.subscribeOn(Schedulers.io())
    .zipWith(obs2.subscribeOn(Schedulers.io()), (x,y) -> new Both(x,y))
    .doOnNext(both -> updateUI(both))
    .subscribe();

【讨论】:

  • 戴夫,感谢您的大力帮助。我已经看到了 zip 运算符,它是同一个 zip 和 zipWith 吗?创建一对两个结果来执行此操作并使用相同的订阅者是一个很好的解决方案吗?我是 Rx 的新手。
  • 使用一个订阅者而不是两个订阅者是个好主意,因为您可以更好地控制初学者的错误行为(例如,一次失败会停止两个可观察对象)。
  • 戴夫,这确实有效,但我对 Schedulers.io() 有疑问。如果您订阅 Schedulers.IO,对于每个 observable 意味着它将在不同的线程中运行?或者它是多余的?谢谢
  • 在做了一些测试之后,似乎对每个 observable 使用 subscribeOn 会使链并行运行,而只使用一个 subscribeOn 似乎是按顺序执行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2019-12-03
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多