single schedulers rxjava programming example curso java rx-java

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.)

  1. Un Observer es un objeto que puede obtener datos de una fuente de datos (un Observable ). La fuente de datos envía datos al llamar al observador onNext() .

  2. Un Subscriber es un Observer que también puede darse de baja de esa fuente de datos (a través de la interfaz de Subscription ).

  3. 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

  1. ¿Qué es un observador?
  2. ¿En qué se diferencia un observador de un suscriptor?
  3. ¿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:

  1. gasta recursos para funcionalidades que no usarás
  2. no puede heredar de otra clase
  3. escribir código incorrecto para cancelar la suscripción
  4. 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 .