web-dev-qa-db-ja.com

BehaviorSubjectとPublishSubject

私は(もしあれば)次に関する黄金のルールを回避しようとしています。

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コンテキストとリスナーコンテキストの2つのコンテキストで使用されることを確認しました。

  • UIコンテキスト(例としてMVVM)

たとえば、 here a BehaviorSubjectが使用され、SubjectではなくObservableを使用する理由は明らかですが、BehaviorSubjectPublishSubjectに変更しましたが、アプリの動作は同じです。

  • リスナーコンテキスト

なぜ project フィールドをBehaviorSubjectではなくPublishSubjectにするのですか?

17
Chulo

PublishSubjectBehaviorSubjectの主な違いは、後者が最後に放出されたアイテムを覚えていることです。そのため、BehaviorSubjectを出力したい場合、statesは本当に便利です。

プロジェクトフィールドをPublishSubjectではなくBehaviorSubjectにするのはなぜですか?

おそらく、彼らはこのメソッドで最後に出力されたプロジェクトを取得できるようにしたいからです:

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

PublishSubject:空で開始し、新しい要素のみをサブスクライバーに送信します。 PublishSubjectは作成直後に要素の放出を開始するため、サブジェクトが作成されてからオブザーバーがサブスクライブするまでに、1つ以上のアイテムが失われる可能性があります。

BehaviorSubject:初期値が必要で、それまたは最新の要素を新しいサブスクライバーにリプレイします。 BehaviorSubjectは常に最新の要素を出力するため、デフォルトの初期値を指定せずに要素を作成することはできません。 BehaviorSubjectは、「経時的な値」を表すのに役立ちます。たとえば、誕生日のイベントストリームはSubjectですが、人の年齢のストリームはBehaviorSubjectになります。

7
H S Progr