Was ist der Unterschied zwischen Observable, Completable und Single in RxJava?


113

Kann jemand bitte den Unterschied zwischen Observable, Completable und Single in RxJava mit klaren Beispielen erklären?

In welchem ​​Szenario verwenden wir eines über das andere?


Hast du etwas erlebt?
J. Chomel

Ich habe gerade erst angefangen .. @ J.Chomel
Raja Jawahar

25
Dies ist eine absolut gültige Frage und hätte nicht geschlossen werden dürfen. Obwohl rx eine großartige Bibliothek ist, sind die Dokumentation und Beispiele leider extrem schlecht und verwirrend.
RunLoop

Antworten:


246

Observableist der generische ReactiveX-Baustein der Ereignisquelle, der im Laufe der Zeit Werte ausgibt. (und existiert somit in jeder Sprache, auf die ReactiveX erweitert wurde)
in Kürze Beobachtbare Ereignisse sind:
onNext * (onCompleted | onError)? / (* null oder mehr? - null oder 1)

Singleund Completablesind neue Typen, die exklusiv bei RxJava eingeführt wurden und reduzierte Typen von darstellen Observable, die eine präzisere API haben.

Singlestellen dar, Observabledass ein einzelner Wert oder Fehler ausgegeben wird.

Completablestellen dar, Observabledass kein Wert ausgegeben wird, sondern nur Terminalereignisse, entweder onErroroderonCompleted

Sie können sich die Unterschiede wie die Unterschiede einer Methode vorstellen, die Folgendes zurückgibt:

  • Sammlung von Objekten - beobachtbar

  • Einzelobjekt - Einzelobjekt

  • und Methode, die keine Werte zurückgibt (void-Methode) - Vervollständigbar.

SingleDies kann angemessen sein, wenn Sie ein aufgabenorientiertes Observable haben und einen einzelnen Wert erwarten, z. B. eine einmal ausgeführte Netzwerkanforderung und einen Rückgabewert (oder einen Fehler). Der Netzwerkaufruf wird einmalig ausgeführt, was bedeutet, dass Sie nicht erwarten, dass er zusätzliche Werte zurückgibt im Laufe der Zeit. Ein weiteres Beispiel ist die DB-Abrufdatenoperation.

Completableist angemessen, wenn Sie einen haben Observableund sich nicht um den Wert kümmern, der sich aus der Operation ergibt, oder wenn es keinen gibt. Beispiele sind beispielsweise das Aktualisieren eines Caches. Die Operation kann entweder erfolgreich sein oder fehlschlagen, es gibt jedoch keinen Wert.
Ein weiteres Beispiel ist eine lang laufende Init-Operation, die nichts zurückgibt. Es kann sich um einen UPDATE / PUT-Netzwerkanruf handeln, der nur zu einer Erfolgsanzeige führte.

In jedem Fall fügen Completable und Single keine neuen Funktionen hinzu, sondern führen robustere und präzisere APIs ein, die mehr über die Vorgänge hinter dem Observable erzählen, die die API verfügbar gemacht hat.

Bearbeiten:

RxJava2 Maybe:

RxJava2 hat einen neuen Typ genannt Maybe, Maybeist die Kombination aus Completableund Einzel.

In der gleichen Sprache wie oben Maybekann man sich eine Methode vorstellen, die Optionaleinen Typ zurückgibt . Sie Optionalist ein Wrapper um Object, der explizit angibt, ob wir einen Wert darin haben - Objectoder nicht (anstelle von null).
Mit können Maybewir entweder einen Wert genau wie haben Singleoder nichts zurückgeben - genau wieCompletable . Zusätzlich haben wir wie beide den Fehler.
Maybeist wertvoll, wenn wir markieren möchten, dass ein Observablemöglicherweise keinen Wert hat und nur vervollständigt wird.
Ein Beispiel würde aus dem Cache abgerufen, wir haben nicht unbedingt einen Wert im Cache, also werden wir in diesem Fall vervollständigen, wie wir onNextmit dem Wert aus dem Cache erhalten.
Dies ist auch sinnvoll, um Nicht-Null-Werte in einem Stream mit RxJava2 zu verarbeiten.

RxJava2 Flowable:

Definieren wir zunächst den Gegendruck. Gegendruck ist ein Mittel, um die Situation zu bewältigen, in der Daten schneller generiert werden, als sie verarbeitet werden können. FlowableUnterstützt den Gegendruck, sodass nachgeschaltete Artikel angefordert werden können. Sie können mehr über die Unterschiede lesen hier .


2
Was ist mit fließfähig?
Niraj Chauhan

Wenn ich also in Kotlin schreibe, ist das Maybe<T>im Wesentlichen Single<T?>?
AAverin

Können Sie in Betracht ziehen Single, ein CompletableWert mit zurückgegebenem Wert zu sein?
Eido95

13
  1. Flowable und Observable können endliche oder unendliche Ströme darstellen. Fließfähiger Gegendruck .
  2. Single sind Streams mit einem einzelnen Element.
  3. Vielleicht sind Streams entweder mit 0 oder einem Element.
  4. Schließlich stellt ein Completable einen Stream ohne Elemente dar, dh er kann nur ohne Wert abgeschlossen werden oder fehlschlagen.

Eine kurze Antwort, die ich hier im Abschnitt RXJava gefunden habe.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.