【问题标题】:What does share operator do in RxJava? When should I use it?共享运算符在 RxJava 中的作用是什么?我应该什么时候使用它?
【发布时间】:2017-08-17 02:45:24
【问题描述】:

我知道 share() 是 publish().refCount() 的替代品。 然后来自 RxJava wiki:

Observable.publish() — 将 Observable 表示为 Connectable Observable ConnectableObservable.refCount() — 使 Connectable Observable 表现得像一个普通的 Observable

这让我很困惑。如果在 publish().refCount() 之后,它的行为就像一个普通的 Observable,我为什么要使用它,这个 api 有什么意义?

【问题讨论】:

    标签: java rx-java rx-java2 reactivex


    【解决方案1】:

    你是对的 - Observable.share 只是 publish().refCount() 的快捷方式。我认为你上面引用的描述并不完全清楚,因为ConnectedObservable.refCount 做了更多:)

    如果您将Observable 转换为ConnectableObservable - 除非明确调用ConnectableObservable.connect,否则它不会发出项目(即使订阅了某些内容) - 它基本上会延迟执行subscribe 方法并防止多次执行它对于每个订阅者。这种技术通常用于确保在 observable 开始发射项目之前订阅所有订阅者(换句话说 - 在每个人都订阅之后 - 调用 connect() 方法)。

    如果您有多个订阅者(经常发生这种情况),您必须处理他们的订阅和取消订阅,这就是事情变得棘手的地方。这就是引入refCount() 的原因。该操作符返回新的 Observable,跟踪订阅了多少订阅者,并在至少有一个订阅时保持连接。当第一个订阅者出现时,它也会自动连接。

    PS。我正在学习如何使用 RxJava,如果我错了,请指出!

    【讨论】:

    • 谢谢你的解释,我知道publish和refCount的意思,只是不明白为什么要一起使用。
    • @WooguxWu 它们一起使用是因为没有publish,没有其他方法可以实现refCount 的行为。在publish().refCount() 之后,你得到的只是一个普通的 Observable,这不是真的 - 或者.. 至少它与应用这些运算符之前的 Observable 不同:)。它的行为受这些运算符的影响。
    • 是的,我知道它一定是不同的,我只是想知道有什么不同。这就像 refCount() 一样吗?但是如果在share之前是不可连接的,那么refCount是如何影响()的呢?
    • @WooguxWu - 它必须可连接才能调用refCount,因为refCount()ConnectableObservable 接口的方法。
    • 对不起,我的英语很糟糕。我的意思是:Observable before share 和 Observable after share 有什么区别?
    猜你喜欢
    • 2011-01-18
    • 2011-08-18
    • 2017-03-21
    • 2011-04-20
    • 2010-09-05
    相关资源
    最近更新 更多