web-dev-qa-db-fra.com

BehaviorSubject vs PublishSubject

J'essaie de comprendre la règle d'or (le cas échéant) concernant:

Quand utiliser BehaviorSubject?

et

Quand utiliser PublishSubject?

La différence entre eux est très claire

Il existe de nombreux types de sujets. Pour cette exigence spécifique, un PublishSubject fonctionne bien parce que nous souhaitons continuer la séquence là où il s'était arrêté. Donc, en supposant que les événements 1, 2, 3 ont été émis dans (B), après que (A) se connecte, nous ne voulons voir que 4, 5, 6. Si nous utilisons un ReplaySubject, nous verrons [1, 2, 3], 4, 5, 6; ou si nous utilisions un BehaviorSubject, nous verrions 3, 4, 5, 6 etc. (source: Comment penser aux sujets dans RxJava (Partie 1) )

J'ai vu que les Subject sont utilisés dans deux contextes (au moins), le contexte d'interface utilisateur et le contexte d'écoute.

  • Contexte d'interface utilisateur (MVVM comme exemple)

Par exemple ici un BehaviorSubject est utilisé, et il est clair pourquoi ils utilisent Subject et non Observable mais j'ai changé le BehaviorSubject à PublishSubject mais le comportement de l'application reste le même.

  • Contexte de l'écouteur

Pourquoi ils font projet un champ BehaviorSubject et non PublishSubject?

17
Chulo

La principale différence entre PublishSubject et BehaviorSubject est que ce dernier se souvient du dernier élément émis. Pour cette raison, BehaviorSubject est vraiment utile lorsque vous voulez émettre states.

Pourquoi font-ils du champ de projet un BehaviorSubject et non un PublishSubject?

Probablement parce qu'ils veulent pouvoir récupérer le dernier projet émis avec cette méthode:

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

PublishSubject: démarre vide et n'émet de nouveaux éléments qu'aux abonnés. Il est possible qu'un ou plusieurs éléments soient perdus entre le moment où le sujet est créé et l'observateur y souscrit car PublishSubject commence à émettre des éléments immédiatement après sa création.

BehaviorSubject: il a besoin d'une valeur initiale et la rejoue ou le dernier élément aux nouveaux abonnés. Comme BehaviorSubject émet toujours le dernier élément, vous ne pouvez pas en créer un sans donner une valeur initiale par défaut. BehaviorSubject est utile pour représenter les "valeurs dans le temps". Par exemple, un flux d'événements d'anniversaires est un sujet, mais le flux de l'âge d'une personne serait un sujet de comportement.

7
H S Progr