BehaviorSubject vs. PublishSubject

Lesezeit: 3 Minuten

Benutzer-Avatar
Uncool

Ich versuche, mich um die goldene Regel (falls vorhanden) zu kümmern:

Wann sollte BehaviorSubject verwendet werden?

und

Wann sollte PublishSubject verwendet werden?

Der Unterschied zwischen ihnen ist sehr deutlich

Es gibt viele Arten von Themen. Für diese spezielle Anforderung eignet sich ein PublishSubject gut, da wir die Sequenz dort fortsetzen möchten, wo sie aufgehört hat. Unter der Annahme, dass die Ereignisse 1,2,3 in (B) ausgegeben wurden, möchten wir nach der erneuten Verbindung von (A) nur 4, 5, 6 sehen. Wenn wir ein ReplaySubject verwenden, würden wir sehen [1, 2, 3], 4, 5, 6; oder wenn wir ein BehaviorSubject verwenden, sehen wir 3, 4, 5, 6 usw. (Quelle: Wie man in RxJava über Subjekte nachdenkt (Teil 1))

das habe ich gesehen Subject‘s werden (mindestens) in zwei Kontexten verwendet, im UI-Kontext und im Listener-Kontext.

  • UI-Kontext (MVVM als Beispiel)

Zum Beispiel hier a BehaviorSubject verwendet wird, und es ist klar, warum sie es verwenden Subject und nicht Observable aber ich habe das geändert BehaviorSubject zu PublishSubject aber das App-Verhalten ist immer noch das gleiche.

  • Listener-Kontext

Warum sie machen Projekt Feld a BehaviorSubject und nicht PublishSubject ?

Benutzer-Avatar
Dmitri

Der Hauptunterschied zw PublishSubject und BehaviorSubject ist, dass letzteres sich an das zuletzt ausgegebene Element erinnert. Deswegen BehaviorSubject ist wirklich nützlich, wenn Sie emittieren möchten states.

Warum machen sie das Projektfeld zu einem BehaviorSubject und nicht zu einem PublishSubject?

Wahrscheinlich, weil sie das letzte ausgegebene Projekt mit dieser Methode abrufen möchten:

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

  • Gibt es nur Zustandsänderungen aus oder sogar, wenn sich der Zustand auf denselben vorherigen Wert ändert? Wie zum Beispiel, wenn ich onNext(‘Adam’), onNext(‘Adam’), onNext(‘Smith’) setze, würde es nur Adam gefolgt von Smith ausgeben?

    – Saifur Rahman Mohsin

    7. September 2019 um 10:30 Uhr

  • @SaifurRahmanMohsin Siehe github.com/akarnokd/RxJava2_9/blob/master/src/main/java/io/…. Es wird nicht überprüft, ob sich der aktuelle Wert überhaupt geändert hat.

    – Navneeth

    21. Februar 2020 um 3:46 Uhr

Benutzer-Avatar
HS-Progr

VeröffentlichenBetreff: Beginnt leer und gibt nur neue Elemente an Abonnenten aus. Es besteht die Möglichkeit, dass zwischenzeitlich ein oder mehrere Gegenstände verloren gehen Thema entsteht und die Beobachter abonniert, weil VeröffentlichenBetreff beginnt sofort nach der Erstellung Elemente zu emittieren.

VerhaltenSubject: Es braucht eine Ursprünglicher Wert und Wiederholungen es oder das neueste Element zu neu Abonnenten. Wie VerhaltenSubject stets emittiert das neustes Elementkönnen Sie keinen erstellen, ohne einen Standardanfangswert anzugeben.
VerhaltenSubject ist hilfreich für die Darstellung “Werte im Laufe der Zeit”. Beispielsweise ist ein Ereignisstrom von Geburtstagen a Themaaber der Altersstrom einer Person wäre a VerhaltenSubject.

Benutzer-Avatar
Pradeep Bishnoi

Betreff veröffentlichen: Hier, wenn ein Schüler spät in den Klassenraum kam, möchte er nur ab dem Zeitpunkt zuhören, zu dem er den Klassenraum betrat. Veröffentlichen ist also das Beste für diesen Anwendungsfall.

Verhaltensthema: Hier möchte ein Student, wenn er spät in den Unterricht eingetreten ist, die neuesten Dinge (nicht von Anfang an) hören, die vom Professor gelehrt werden, damit er eine Vorstellung vom Kontext bekommt. Hier verwenden wir also Behavior.

  • Ich liebe diese Beschreibung als verständliche Alternative zur klassischen technischen Erklärung. Vielen Dank!

    – kjanderson2

    2. Dezember 2020 um 17:12 Uhr

Benutzer-Avatar
Igor L Sambo

Der Unterschied zwischen BehaviourSubject und PublishSubject hängt davon ab, wie lange sie die von ihnen erfassten Daten aufbewahren, zum Beispiel hält PublishSubject die Daten nur im Moment verfügbar und wird bei jedem Eintrag aktualisiert, während BehaviourSubject die zuletzt eingefügten Daten beibehält, sodass Sie sie beispielsweise zum Bestätigen verwenden können Passwort auf einem Anmeldeformular und als Beispiel für PublishSubject, das Durchführen einer Suche, und es muss die Daten ständig aktualisieren, um genaue Ergebnisse zu liefern, und es besteht keine allzu große Notwendigkeit, eingefügte Daten zu vergleichen.

Als Referenz lasse ich diese beiden Fotos von http://reactivex.io/documentation/subject.html

VeröffentlichenBetreff

VerhaltenBetreff

1055170cookie-checkBehaviorSubject vs. PublishSubject

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy