BehaviorSubject vs PublishSubject

时间:2018-04-25 10:47:57

标签: android rx-java

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

  

何时使用BehaviorSubject?

  

何时使用PublishSubject?

它们之间的区别很明显

  

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

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

  • UI上下文(以MVVM为例)

例如here使用了BehaviorSubject,很明显为什么他们使用Subject而不是Observable,但我已将BehaviorSubject更改为{{} 1}}但应用行为仍然相同。

  • 听众背景

为什么他们将project字段设为PublishSubject而不是BehaviorSubject

4 个答案:

答案 0 :(得分:12)

PublishSubjectBehaviourSubject之间的主要区别在于后者会记住最后一个发出的项目。因为BehaviourSubject在您想要发出states时非常有用。

  

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

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

@Override public @NonNull Observable<Project> project() {
  return this.project;
}

答案 1 :(得分:4)

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

BehaviorSubject:它需要一个初始值并向新订户重播它或最新元素。由于BehaviorSubject总是发出最新的元素,因此如果不提供默认的初始值就无法创建一个元素。 BehaviorSubject有助于描述“随时间变化的值”。例如,生日事件流是主题,而一个人年龄的流将是BehaviorSubject。

答案 2 :(得分:3)

发布主题:在这里,如果学生进入教室较晚,那么他只是想从进入教室的那一刻开始聆听。因此,对于这种用例,发布将是最好的。

行为主体:在这里,如果学生迟到教室,他想听教授教授的最新内容(不是从一开始),以便他了解上下文。因此,这里我们将使用行为。

答案 3 :(得分:0)

BehaviourSubject和PublishSubject的区别取决于它们将捕获的数据保留多长时间,例如PublishSubject仅使数据暂时可用并在每个条目上保持更新,而BehaviourSubject则保留最后插入的数据,因此您可以使用例如,在注册表单上确认密码的示例,以及作为PublishSubject的示例,执行搜索,并且它必须不断更新数据以提供准确的结果,并且没有太多必要比较插入的数据。

作为参考,我留下了http://reactivex.io/documentation/subject.html的这两张照片

PublishSubject

BehaviourSubject