Quelle est la différence entre Observable, Completable et Single dans RxJava

113

Quelqu'un peut-il expliquer la différence entre Observable, Completable et Single dans RxJava avec des exemples clairs?

Dans quel scénario utilisons-nous l'un sur les autres?

Raja Jawahar
la source
Avez-vous vécu quelque chose?
J. Chomel
Je viens de commencer récemment .. @ J.Chomel
Raja Jawahar
25
C'est une question parfaitement valable et n'aurait pas dû être fermée. Bien que rx soit une excellente bibliothèque, la documentation et les exemples sont malheureusement extrêmement pauvres et déroutants.
RunLoop

Réponses:

248

Observableest le bloc de construction générique ReactiveX, de la source d'événements qui émet des valeurs au fil du temps. (et existe donc dans toutes les langues auxquelles ReactiveX a été étendu)
en bref Les événements observables sont:
onNext * (onCompleted | onError)? / (* zéro ou plus? - zéro ou 1)

Singleet Completablesont de nouveaux types introduits exclusivement chez RxJava qui représentent des types réduits de Observable, qui ont une API plus concise.

Singlereprésentent Observablequi émettent une valeur ou une erreur unique.

Completablereprésentent Observablequi n'émet aucune valeur, mais uniquement des événements terminaux, soit onErrorouonCompleted

Vous pouvez penser aux différences comme aux différences d'une méthode qui renvoie:

  • Collection d'objets - Observable

  • Objet unique - Unique

  • et méthode qui ne renvoie aucune valeur (méthode void) - Complétable.

Singlepeut être approprié lorsque vous avez Observable orienté tâche et que vous attendez une valeur unique, comme une requête réseau qui est effectuée une fois et une valeur renvoyée (ou une erreur), l'appel réseau est exécuté en une seule fois, ce qui signifie que vous ne vous attendez pas à ce qu'il renvoie des valeurs supplémentaires heures supplémentaires. Un autre exemple est l'opération de récupération de données DB.

Completableest approprié lorsque vous avez un Observableet que vous ne vous souciez pas de la valeur résultant de l'opération, ou qu'il n'y en a pas. Les exemples sont la mise à jour d'un cache par exemple, l'opération peut réussir / échouer, mais il n'y a aucune valeur.
Un autre exemple est une opération d'initialisation de longue durée qui ne renvoie rien. Il peut s'agir d'un appel réseau UPDATE / PUT qui n'a abouti qu'à une indication de succès.

Dans tous les cas, Completable et Single n'ajoutent pas de nouvelles fonctionnalités mais introduisent des API plus robustes et concises, qui en disent plus sur les opérations derrière l'Observable que l'API a exposées.

Éditer:

RxJava2 Maybe:

RxJava2 a ajouté un nouveau type appelé Maybe, Maybeest la combinaison de Completableet Single.

Dans le même langage que ci-dessus, Maybepeut être considéré comme une méthode qui retourne un Optionalcertain type, Optionalest un wrapper autour de Object qui indique explicitement si nous avons une valeur dedans - Objectou non (au lieu de null).
Avec Maybenous pouvons soit avoir une valeur exactement comme, Singlesoit ne rien renvoyer - tout comme Completable. De plus, comme les deux, nous avons l'erreur.
Maybeest utile lorsque nous voulons marquer qu'un Observablepeut ne pas avoir de valeur et se terminera simplement.
Un exemple serait extrait du cache, nous n'aurons pas nécessairement une valeur dans le cache, donc dans ce cas, nous allons compléter, comment nous obtiendrons onNextla valeur du cache.
Cela vaut également la peine de gérer des valeurs non nulles dans un flux avec RxJava2.

RxJava2 Flowable:

Tout d'abord, définissons la contre-pression. La contre-pression est un moyen de gérer la situation où les données sont générées plus rapidement qu'elles ne peuvent être traitées. Flowablea un support de contre-pression permettant en aval de demander des articles. Vous pouvez en savoir plus sur les différences ici .

Yosriz
la source
2
Qu'en est-il fluide?
Niraj Chauhan le
Donc, si j'écris en Kotlin, est Maybe<T>-ce essentiellement Single<T?>?
AAverin
Pouvez-vous considérer Singlecomme un Completableavec une valeur retournée?
Eido95
13
  1. Flowable et Observable peuvent représenter des flux finis ou infinis. Contre -pression de support fluide .
  2. Les flux uniques sont composés d'un seul élément.
  3. Peut - être sont - ils des flux avec 0 ou un élément.
  4. Enfin, un Completable représente un flux sans éléments, c'est-à-dire qu'il ne peut se terminer que sans valeur ou échouer.

Une réponse concise que j'ai trouvée ici dans la section RXJava.

Charith De Silva
la source