我正试图绕过黄金法则(如果有的话):
何时使用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上下文和监听器上下文。
例如here使用了BehaviorSubject
,很明显为什么他们使用Subject
而不是Observable
,但我已将BehaviorSubject
更改为{{} 1}}但应用行为仍然相同。
为什么他们将project字段设为PublishSubject
而不是BehaviorSubject
?
答案 0 :(得分:12)
PublishSubject
和BehaviourSubject
之间的主要区别在于后者会记住最后一个发出的项目。因为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的这两张照片