Qual è la differenza tra Observable, Completable e Single in RxJava


113

Qualcuno può spiegare la differenza tra Observable, Completable e Single in RxJava con esempi chiari?

In quale scenario usiamo uno rispetto agli altri?


Hai provato qualcosa?
J. Chomel

Ho appena iniziato di recente .. @ J.Chomel
Raja Jawahar

25
Questa è una domanda perfettamente valida e non avrebbe dovuto essere chiusa. Sebbene rx sia un'ottima libreria, la documentazione e gli esempi sono purtroppo estremamente poveri e confusi.
RunLoop

Risposte:


248

Observableè il blocco predefinito generico di ReactiveX, dell'origine dell'evento che emette valori nel tempo. (e quindi esiste in ogni linguaggio a cui ReactiveX è esteso)
in breve Gli eventi osservabili sono:
onNext * (onCompleted | onError)? / (* zero o più? - zero o 1)

Singlee Completablesono nuovi tipi introdotti esclusivamente su RxJava che rappresentano tipi ridotti di Observable, che hanno API più concise.

Singlerappresentano Observableche emettono un singolo valore o errore.

Completablerappresentano Observableche non emette alcun valore, ma solo eventi terminali, o onErroroonCompleted

Puoi pensare alle differenze come le differenze di un metodo che restituisce:

  • Collezione di oggetti - Osservabile

  • Oggetto singolo - Singolo

  • e metodo che non restituisce valori (metodo void) - Completabile.

Singlepuòessere appropriato quando hai Observable orientato alle attività e ti aspetti un valore singolo, come la richiesta di rete che viene eseguita una volta e restituisce un valore (o un errore), la chiamata di rete viene gestita in una volta, il che significa che non ti aspetti che restituisca valori aggiuntivi col tempo. Un altro esempio è l'operazione di recupero dati da parte del database.

Completableè appropriato quando hai un Observablee non ti interessa il valore derivante dall'operazione, o non ce n'è. Ad esempio, l'aggiornamento di una cache, l'operazione può avere esito positivo o negativo, ma non esiste alcun valore.
Un altro esempio è qualche operazione di inizializzazione di lunga durata che non restituisce nulla. Può essere una chiamata di rete UPDATE / PUT che ha avuto come risultato solo l'indicazione di successo.

In ogni caso, Completable e Single non stanno aggiungendo nuove funzionalità ma stanno introducendo API più robuste e concise, che dicono di più sulle operazioni dietro l'osservabile che l'API ha esposto.

Modificare:

RxJava2 Maybe:

RxJava2 ha aggiunto un nuovo tipo chiamato Maybe, Maybeè la combinazione di Completablee Single.

Nello stesso linguaggio come sopra, Maybepuò essere pensato come un metodo che restituisce un Optionalcerto tipo, Optionalè un wrapper attorno a Object che dice esplicitamente se abbiamo un valore in esso Objecto no (invece di null).
Con Maybepossiamo avere un valore esattamente uguale Singleo non restituire nulla, proprio come Completable. Inoltre, come entrambi, abbiamo l'errore.
Maybeè utile quando vogliamo segnalare che un Observablepotrebbe non avere un valore e verrà semplicemente completato.
Un esempio potrebbe essere recuperato dalla cache, non avremo necessariamente un valore nella cache, quindi in questo caso lo completeremo, ow lo otterremo onNextcon il valore dalla cache.
Questo è anche degno di gestire valori non nulli in un flusso con RxJava2.

RxJava2 Flowable:

Innanzitutto, definiamo la contropressione. La contropressione è un mezzo per gestire la situazione in cui i dati vengono generati più velocemente di quanto possano essere elaborati. Flowableha il supporto di contropressione che consente a valle di richiedere articoli. Puoi leggere di più sulle differenze qui .


2
E il flowable?
Niraj Chauhan,

Quindi se sto scrivendo in Kotlin Maybe<T>, essenzialmente Single<T?>?
AAverin

Puoi considerare Singledi essere un Completablecon valore restituito?
Eido95

13
  1. Flowable e Observable possono rappresentare flussi finiti o infiniti. Contropressione fluida del supporto .
  2. Single sono flussi con un singolo elemento.
  3. Forse sono flussi con 0 o un elemento.
  4. Infine un Completable rappresenta un flusso senza elementi, cioè può solo completare senza un valore o fallire.

Una risposta concisa l'ho trovata qui nella sezione RXJava.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.