BehaviorSubject vs PublishSubject

Chu*_*ulo 21 android rx-java rx-swift reactivex

我正试图绕过黄金法则(如果有的话):

何时使用BehaviorSubject?

何时使用PublishSubject?

他们之间的区别非常明显

有很多种科目.对于这个特定的要求,PublishSubject运行良好,因为我们希望从它停止的位置继续序列.所以假设事件1,2,3在(B)中发出,在(A)连接之后我们只想看到4,5,6.如果我们使用ReplaySubject,我们会看到[1,2,3],4, 5,6; 或者如果我们使用了BehaviorSubject,我们会看到3,4,5,6等等(来源:如何考虑RxJava中的主题(第1部分))

我已经看到它Subject用于两个上下文(至少),UI上下文和监听器上下文.

  • UI上下文(以MVVM为例)

例如这里一个BehaviorSubject被使用,并且他们为什么使用它显然Subject并没有Observable,但我已经改变了BehaviorSubjectPublishSubject,但应用程序的行为仍然是相同的.

  • 监听器上下文

他们为什么要创建项目领域BehaviorSubject而不是PublishSubject

Dmi*_*try 22

PublishSubject和之间的主要区别BehaviorSubject是后者记住最后一个发射的项目.因为这BehaviorSubject在您想要发射时非常有用states.

为什么他们将项目字段设为BehaviorSubject而不是PublishSubject?

可能是因为他们希望能够使用此方法检索最后发出的项目:

@Override public @NonNull Observable<Project> project() {
  return this.project;
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*noi 15

发布主题:这里,如果一个学生进教室晚了,他只想从他进教室的那个时间点开始听。因此,发布将是此用例的最佳选择。

行为主题:在这里,如果一个学生进入教室很晚,他想听教授最近教的东西(不是从头开始),以便他了解上下文。所以,在这里我们将使用 Behavior。

  • 喜欢这个描述,作为经典技术解释的一种易于理解的替代方案。谢谢你! (2认同)

H S*_*ogr 9

PublishSubject:开始为空,仅向订阅者发出新元素。在创建主题观察者订阅之间可能会丢失一个或多个项目,因为PublishSubject在创建后立即开始发出元素。

BehaviorSubject:它需要一个初始值重播,或以新的最新元素的用户。作为BehaviorSubject总是发出最新的元素,你不能没有给默认的初始值创建一个。 BehaviorSubject有助于描述“随时间变化的值”。例如,生日的事件流是Subject,但是一个人的年龄流将是BehaviorSubject