私は(もしあれば)次に関する黄金のルールを回避しようとしています。
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つのコンテキストで使用されることを確認しました。
たとえば、 here a BehaviorSubject
が使用され、Subject
ではなくObservable
を使用する理由は明らかですが、BehaviorSubject
をPublishSubject
に変更しましたが、アプリの動作は同じです。
なぜ project フィールドをBehaviorSubject
ではなくPublishSubject
にするのですか?
PublishSubject
とBehaviorSubject
の主な違いは、後者が最後に放出されたアイテムを覚えていることです。そのため、BehaviorSubject
を出力したい場合、states
は本当に便利です。
プロジェクトフィールドをPublishSubjectではなくBehaviorSubjectにするのはなぜですか?
おそらく、彼らはこのメソッドで最後に出力されたプロジェクトを取得できるようにしたいからです:
@Override public @NonNull Observable<Project> project() {
return this.project;
}
PublishSubject:空で開始し、新しい要素のみをサブスクライバーに送信します。 PublishSubjectは作成直後に要素の放出を開始するため、サブジェクトが作成されてからオブザーバーがサブスクライブするまでに、1つ以上のアイテムが失われる可能性があります。
BehaviorSubject:初期値が必要で、それまたは最新の要素を新しいサブスクライバーにリプレイします。 BehaviorSubjectは常に最新の要素を出力するため、デフォルトの初期値を指定せずに要素を作成することはできません。 BehaviorSubjectは、「経時的な値」を表すのに役立ちます。たとえば、誕生日のイベントストリームはSubjectですが、人の年齢のストリームはBehaviorSubjectになります。