¿Cuál es la diferencia entre Observable, Completable y Single en RxJava?

113

¿Alguien puede explicar la diferencia entre Observable, Completable y Single en RxJava con ejemplos claros?

¿En qué escenario usamos uno sobre los demás?

Raja Jawahar
fuente
¿Has experimentado algo?
J. Chomel
Acabo de empezar recientemente ... @ J.Chomel
Raja Jawahar
25
Esta es una pregunta perfectamente válida y no debería haberse cerrado. Aunque rx es una gran biblioteca, la documentación y los ejemplos son, lamentablemente, extremadamente pobres y confusos.
RunLoop

Respuestas:

248

Observablees el componente genérico de ReactiveX, de origen de eventos que emite valores a lo largo del tiempo. (y por lo tanto existe en todos los idiomas a los que se extendió ReactiveX)
en resumen Los eventos observables son:
onNext * (onCompleted | onError)? / (* ¿cero o más? - cero o 1)

Singley Completableson nuevos tipos introducidos exclusivamente en RxJava que representan tipos reducidos de Observable, que tienen una API más concisa.

Singlerepresentan Observableque emiten valor único o error.

Completablerepresentan Observableque no emite ningún valor, sino solo eventos terminales, ya sea onErroroonCompleted

Puede pensar en las diferencias como las diferencias de un método que devuelve:

  • Colección de objetos: observable

  • Objeto único - Soltero

  • y método que no devuelve valores (método vacío) - Completable.

Singlepuede ser apropiado cuando tiene Observable orientado a tareas y espera un valor único, como la solicitud de red que se realiza una vez y devuelve un valor (o error), la llamada de red se opera de una manera única, lo que significa que no espera que devuelva valores adicionales tiempo extraordinario. Otro ejemplo es la operación de obtención de datos de DB.

Completablees apropiado cuando tiene un Observabley no le importa el valor resultante de la operación, o no lo hay. Los ejemplos son actualizar un caché, por ejemplo, la operación puede tener éxito o fallar, pero no hay ningún valor.
Otro ejemplo es una operación init de larga ejecución que no devuelve nada. Puede ser una llamada de red UPDATE / PUT que resultó con indicación de éxito solamente.

En cualquier caso, Completable y Single no están agregando nuevas capacidades, pero están introduciendo API más robustas y concisas, que brindan más información sobre las operaciones detrás del Observable que la API expuso.

Editar:

RxJava2 Maybe:

RxJava2 agregó un nuevo tipo llamado Maybe, Maybees la combinación de Completabley Single.

En el mismo lenguaje que el anterior, Maybese puede pensar como un método que devuelve Optionalalgún tipo, Optionales un envoltorio alrededor de Object que dice explícitamente si tenemos algún valor en él, Objecto no (en lugar de nulo).
Con Maybepodemos tener un valor exactamente igual Singleo no devolver nada, igual que Completable. Además, como ambos, tenemos el error.
Maybees valioso cuando queremos marcar que un Observablepuede no tener un valor y simplemente se completará.
Se obtendría un ejemplo de la caché, no necesariamente tendremos un valor en la caché, por lo que en este caso, completaremos, ahora obtendremos onNextcon el valor de la caché.
Esto también es útil para manejar valores no nulos en una secuencia con RxJava2.

RxJava2 Flowable:

Primero, definamos la contrapresión. La contrapresión es un medio de manejar la situación en la que los datos se generan más rápido de lo que se pueden procesar. Flowabletiene soporte de contrapresión que permite que aguas abajo soliciten artículos. Puedes leer más sobre las diferencias aquí .

Yosriz
fuente
2
¿Qué pasa con fluidos?
Niraj Chauhan
Entonces, si estoy escribiendo en Kotlin, ¿es Maybe<T>, esencialmente Single<T?>,?
AAverin
¿Se puede considerar Singleun Completablevalor devuelto?
Eido95
13
  1. Fluido y observable pueden representar corrientes finitas o infinitas. Fluido apoyo de contrapresión .
  2. Single son corrientes con un solo elemento.
  3. Quizás sean transmisiones con 0 o un elemento.
  4. Finalmente, un Completable representa un flujo sin elementos, es decir, solo se puede completar sin un valor o fallar.

Una respuesta concisa que encontré aquí en la sección RXJava.

Charith De Silva
fuente