java - schedulers - ¿Cuál es la diferencia entre un observador y un suscriptor?
schedulers rxjava (4)
(Editar: Esto aparentemente solo es cierto para RxJava 1.)
-
Un
Observer
es un objeto que puede obtener datos de una fuente de datos (unObservable
). La fuente de datos envía datos al llamar al observadoronNext()
. -
Un
Subscriber
es unObserver
que también puede darse de baja de esa fuente de datos (a través de la interfaz deSubscription
). -
La función
getCar()
está tratando de devolver automóviles, pero no hay un método directo para hacerlo. Pero hay una función para obtener detalles del automóvil (getCarDetails()
) que llamará a un observador con todos los detalles del automóvil. Entonces llama a esa función y le pasa un observador que, cuando obtiene datos, obtendrá los datos del automóvil de los detalles y los pasará a su propio observador.
Estoy tratando de descifrar la siguiente función:
Subscription getCar(id, Observer<Car> observer) {
return getCarDetails(id, new Observer<CarDetails> {
@Override
onNext(CarDetails details) {
observer.onNext(details.getCar());
} });
}
Obtuve una buena introducción a rxjava de http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ pero solo mencionó a Observer de pasada, diciendo que usará la mayoría de los suscriptores tiempo para artículos de consumo emitidos por un observable.
Alguien me puede explicar
- ¿Qué es un observador?
- ¿En qué se diferencia un observador de un suscriptor?
- ¿Qué hace el fragmento de código anterior?
Javadoc hizo parecer como un suscriptor. El javadoc para suscriptores dice que implementa observador y suscripción. Estoy muy confundido.
También en
RxJava2
, si desea darse de baja, debe usar
ResourceObserver
para
Observable
y
ResourceSubscriber
para
Flowable
.
Mira esta question
EDITADO : con el comentario de @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Por lo tanto, un
Subscriber
es una implementación del
Observer
, con una semántica adicional en la suscripción (se trata más bien de la cancelación de la suscripción).
El código en su pregunta solo muestra que pasa la interfaz de
Observer
, en lugar de la implementación (práctica de programación habitual).
Además, este código devuelve una
Subscription
, que puede deberse a que el autor de este código pensó que el cliente solo debería tener acceso a los métodos de
Subscription
, sin acceso a los elementos producidos por el observable.
Eso puede ser un error del programador.
larga historia
Realmente deberías leer el contenido de este sitio web (o libro): http://www.introtorx.com Se trata de Rx.Net, pero los conceptos son los mismos, fueron creados por Erik Meijer y los implementadores de RxJava los siguieron ( si corresponde al lenguaje Java).
Esta página le interesará (es el segundo capítulo): KeyTypes
Aquí leerás en los primeros párrafos:
Hay dos tipos clave para entender cuando se trabaja con Rx, y un subconjunto de tipos auxiliares que lo ayudarán a aprender Rx de manera más efectiva. IObserver e IObservable forman los bloques de construcción fundamentales para Rx, mientras que las implementaciones de ISubject reducen la curva de aprendizaje para los desarrolladores nuevos en Rx.
...
Esencialmente, Rx se basa en los cimientos del patrón Observador. .NET ya expone algunas otras formas de implementar el patrón Observador, como los delegados o eventos de multidifusión (que generalmente son delegados de multidifusión).
Incluso si los tipos / API son un poco diferentes, aprenderá mucho con este libro, probablemente mucho más que con algunos blogs.
Lo que este libro no dice ( ... porque está en la implementación de RxJava )
El desarrollador principal de RxJava en este momento introdujo una ligera variación (ver PR #792 ) que permitió distinguir dos tipos de contratos:
-
notificación ->
Observer
-
(un) suscripción ->
Subscription
Este cambio permitió expresar / dividir mejor estas preocupaciones de las clases implementadoras de la biblioteca RxJava.
Sin embargo, como usuario de la biblioteca, usar implementaciones reales de la biblioteca RxJava debería ser lo suficientemente bueno.
La implementación de un suscriptor requiere mucho más conocimiento, trabajo y cuidado, de hecho, la semántica de suscripción es muy importante dependiendo del tipo de fuente observable (¿Caliente o frío? ¿Costoso de crear?)
Exponer al
Subscriber
lugar de al
Observer
en casos como el anterior no interferirá con el código en la mayoría de los casos, pero no es el uso previsto para él a menos que se necesite esa semántica de cancelación de suscripción.
Pero al final implementa un
Subscriber
, y puede implicar caer en algunas trampas como:
- gasta recursos para funcionalidades que no usarás
- no puede heredar de otra clase
- escribir código incorrecto para cancelar la suscripción
- copiar / pegar código un código incorrecto o código correcto escrito para un contexto diferente
En RxJava 2
org.reactivestreams.Subscriber
es una interfaz que cumple con la
especificación Reactive Streams
.
La principal diferencia con
Observable
es que el nuevo
Subscriber
admite la contrapresión.
Observer
está suscrito a
Observable
, y el
Subscriber
está suscrito a
Flowable
(implementa
org.reactivestreams.Publisher
).
Ver descripción detallada here .