【问题标题】:How can I replace the EventBus pattern with RxJava presenters?如何用 RxJava 演示者替换 EventBus 模式?
【发布时间】:2016-03-10 20:04:28
【问题描述】:

Controller + EventBus 模式在 Android 中运行良好,但到处触发事件变得非常混乱。如果控制器多次被要求加载相同的数据,很容易让它第一次开始加载,并在加载时忽略后续请求,并在加载完成后开始监听未来的加载请求。我怎样才能用 RxJava 做到这一点(使用 MVP 演示者?)

场景

我的 android 应用中有一个单例 ColorModel,它以 Observable<String>(字符串 == hexcode)的形式加载我最喜欢的颜色 (from multiple sources)。

我的ColorPresenter 挂钩到ColorModel,将String 十六进制码转换为Color 可以显示在ColorView 中的对象。

这些是我的逻辑的主要部分:

  1. Observable<String> getColor()(来自ColorModel
  2. Observable<Color> getColorForView()(来自ColorPresenter
  3. subscribe()(在ColorView

问题

  • #1 在每个订阅上创建。如果我有多个演示者调用 #1,这非常浪费。我不希望重复此步骤(仅在第一次调用时启动,然后在之后缓存)。
  • 当我在onStop() 期间取消订阅时,#2 被取消(需要),但取消订阅会冒泡到 #1 也被取消(不需要)。

【问题讨论】:

  • 您需要向我们展示您的代码。仅仅描述是不够的。
  • 另外,第一个问题似乎真的不是什么大问题 - 可观察的计算成本有多高?
  • @Enigmativity 假装它在计算上非常昂贵(我实际上并没有加载最喜欢的颜色,它是一个简化版本)
  • 好的,你现在需要向我们展示真实的代码。

标签: android system.reactive rx-java reactive-programming reactivex


【解决方案1】:

您可以将 ConnectedObservables 与重放运算符一起使用。请参阅Single Observable with Multiple Subscribers 接受的答案。

【讨论】:

    【解决方案2】:

    你应该看看运营商cache。您可以使用它并将对可观察对象的引用存储在某处(例如ConnectableObservable)。

    请注意,因为您无法取消订阅使用 cache 运算符创建的 observable。但在你的情况下,这就是你想要的,因为从 #2 退订不再影响 #1 生命周期。

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2010-10-05
      • 1970-01-01
      • 2017-02-05
      • 2020-06-11
      • 1970-01-01
      相关资源
      最近更新 更多