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ó Observer de pasada, diciendo que usará Subscriber la mayor parte del tiempo a los artículos de consumo emitidos desde un Observable.
¿Alguien puede explicarme?
- ¿Qué es un observador?
- ¿En qué se diferencia un observador de un suscriptor?
- ¿Qué hace el fragmento de código anterior?
Javadoc hizo que pareciera un suscriptor. El javadoc para suscriptor dice que implementa observador y suscripción. Estoy muy confundido.
Respuestas:
EDITADO : con el comentario de @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Entonces, un suscriptor es una implementación del observador , con semántica adicional en la suscripción (se trata más de cancelar la suscripción). El código en su pregunta solo muestra que pasa la
Observer
interfaz, en lugar de la implementación (práctica de programación habitual).Además, este código devuelve un
Subscription
, que puede deberse a que el autor de este código pensó que el cliente solo debería tener acceso aSubscription
métodos, sin acceso a elementos producidos por lo observable. Eso puede ser un error del programador.larga historia
Realmente debería leer el contenido de este sitio web (o reservar): http://www.introtorx.com Se trata de Rx.Net, pero los conceptos son los mismos, que fueron creados por Erik Meijer y RxJava ejecutores siguieron ellos ( si es aplicable al lenguaje Java).
Esta página te interesará (es el segundo capítulo): KeyTypes
Aquí leerás en los primeros párrafos:
...
Incluso si los tipos / API son un poco diferentes, aprenderá mucho con este libro, probablemente mucho más que con algunos blogs.
Lo que no dice este libro ( ... 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:
Observer
Subscription
Este cambio permitió expresar / dividir mejor estas preocupaciones de las clases de implementación de la biblioteca RxJava.
Sin embargo, como usuario de la biblioteca, el uso de implementaciones reales de la biblioteca RxJava debería ser lo suficientemente bueno.
Implementar un suscriptor requiere mucho más conocimiento, trabajo y cuidado; de hecho, la semántica de la suscripción es muy importante dependiendo del tipo de fuente observable (¿caliente o fría? ¿Caro de crear?)
Exponer en
Subscriber
lugar deObserver
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 implementar aSubscriber
, y puede implicar caer en algunos escollos como:fuente
(Editar: esto aparentemente solo es cierto para RxJava 1.)
An
Observer
es un objeto que puede obtener datos de una fuente de datos (anObservable
). La fuente de datos le envía datos llamando al del observadoronNext()
.A
Subscriber
es unObserver
que también puede darse de baja de esa fuente de datos (a través de laSubscription
interfaz).La
getCar()
función intenta devolver coches, pero no existe 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, buscará los datos del automóvil a partir de los detalles y los pasará a su propio observador.fuente
En RxJava 2
org.reactivestreams.Subscriber
hay una interfaz que cumple con la especificación Reactive Streams .La principal diferencia
Observable
es que los nuevosSubscriber
soportes contrapresión.Observer
está suscritoObservable
ySubscriber
suscrito aFlowable
(implementosorg.reactivestreams.Publisher
).Ver descripción detallada aquí .
fuente
También en RxJava2 , si desea darse de baja, debe usar
ResourceObserver
forObservable
yResourceSubscriber
forFlowable
.Marque esta pregunta
fuente