• slidebg1

RxJava 2 y RxAndroid: Programación Reactiva para Java y Android


Hoy vamos a continuar con ejemplos de programación reactiva, en este post abordaremos la programación reactiva en Android utilizando la librería RxJava. Al igual que la libraría RxSwift, es la implementación en java del concepto de programación reactiva. RxJava ha sido publicada bajo la licencia Apache 2.0 y provee de una API Java para programación asíncrona utilizando Streams (Flujos) observables.

 

BLOQUES PRINCIPALES DE RXJAVA:

Los principales bloques de RxJava son los siguientes:

  • Observables: Representan fuentes de datos
  • Suscriptores (observadores): Permanecen a la espera de eventos que produzcan los elementos observables
  • Un conjunto de métodos para modificar y componer los conjuntos de datos. 

En resumen: Un observable emite ítems mientras que un suscriptor consume estos ítems.

 

OBSERVABLES

Los observables son fuentes de datos que proveen a los suscriptores datos una vez éstos últimos se suscriben. Un observables puede emitir cualquier número de ítems (cero incluido). Pueden terminar con éxito o con un error y pueden ser generadores de datos infinitos.

 

SUSCRIPTORES

Un observables puede tener cualquier número de suscriptores. Si un nuevo dato se emite desde un observable, el método onNext() es llamado para cada suscriptor. Si el observable finaliza el flujo de datos de manera correcta se llama al método onComplete() de cada suscriptor. En caso contrario se llama al método onError()  de cada suscriptor.

 

AÑADIR RXJAVA 2 A UN PROYECTO JAVA

Para añadir RxJava 2 a un proyecto utilizando Gradle tendremos que añadir la siguiente dependencia al fichreo build.gradle.

 

CREACIÓN DE OBSERVABLES, SUSCRIPCIÓN Y LIBERACIÓN DE MEMORIA

 

Creación de observables:

 

Tipos de observables

Los tipos de observables que se pueden crear en RxJava Son:

 

Tipo 

  Descripción

Flowable 

  Emite 0 o n ítems y termina con éxito o un evento de error. Permite establecer cómo de rápido se emitirán estos ítems.

Observable 

  Emite 0 o n ítems y termina con exíto o un evento de error

Single 

  Emite un único ítem o lanza un evento de error. Es la versión reactiva del método call.

Maybe 

  Produce éxito con la emisión de un ítem, de ningún o si se produce un error. Es la versión reactiva de un Optional.

Completable 

  Nunca emite ítems, puede finalizar con un evento de error o de éxito. Es la versión reactiva de un Runnable

 

Métodos de creación de observables

RxJava provee los siguientes métodos para creación de observables

  • Observable.just() – Permite crear un observable como un envoltorio (Wrapper) sobre otro tipo de datos.
  • Observable.fromIterable() – Toma un Iterable y emite sus valores según el orden de la estructura.
  • Observable.fromArray() – Toma un array y emite sus valores en su orden.
  • Observable.fromCallable() – Permite crear un observable para un java.util.concurrent.Callable.
  • Observable.fromFuture() – Permite crear un observable para un concurrent.Future.
  • Observable.interval() – Un observable emite valores Long dentro del interval dado.

Similar a estos métodos existen métodos de creación para todos los tipos de observables (Flowable, Single…)

 

Suscripción en RxJava

Para recibir datos emitidos de un observable es necesario suscribirse a él. Existe gran variad de métodos de suscripción como por ejemplo:

 

También se puede realizar de forma verbosa indicando la implementación de cada método.

 

Es importante que se realice una llamada al método dispose al final para que se liberen de forma adecuada todos los recursos que pueda utilizar el observador (suscriptor).

 

RxJava para Android: RXANDROID

 

RxAndroid es una extensión de RxJava. Provee un scheduler (programador) para ejecutar código en el hilo principal de Android. Además permite crear nuevos schedulers para cualquier handler. Con estos scheculder se puede definir un observable que se ejecutará en background y emitirá los resultados en el hilo principal. Este caso es perfecto para reemplazar las implementaciones de AsyncTask.

 

Para añadir RxJava + RxAndroid en un proyecto, hay que añadir las siguientes dependencias al fichero build.gradle

 

Ejemplo:

 

Vamos a probar lo que hemos aprendido con un ejemplo en el que nos conectaremos a un servicio climatológico (openweathermap) donde obtendremos los datos climatológicos de la ciudad de Londres. Dicho servicio puede devolver los datos en distintos formatos (xml, json..). La conexión y parseo de los datos quedan fuera del ámbito del presente post aunque se pueden observar en el código del proyecto alojado en Github.

 

En el ejemplo dispondremos de dos elementos visuales en pantalla, un botón y un recyclerView. Al pulsar sobre el botón se realizará una petición al servicio climatológico y una vez se reciban y parseen los datos se actualizará el recyclerView con las temperaturas máximas y mínimas de cada día.

 

El código de que se ejecutaría al presionar el botón sería:

 

Como podemos observar se está creando un objeto titleObservable que emitirá lista de objetos Temperature. Esta lista se obtiene al realizar una llamada sobre el cliente rest que realizará la siguiente petición y compondrá la lista a devolver a partir del JSON devuelto por el servicio.

 

 

A continuación debemos suscribirnos para poder acceder a las temperaturas, para ello se configura está suscripción mediante una cadena de llamadas, donde:  

  • En primer lugar mediante el método subscribeOn definimos que la emisión se debe realizar en un hilo de background
  • Seguidamente indicamos con observeOn en qué hilo queremos que se ejecute la respuesta, en este caso el hilo principal (mainThread)
  • Finalmente llamamos a subscribe que será la función que se ejecute al recibir los elementos.

Es importante añadir este suscriptor a la lista compuesta (CompositeDisposable) para que se liberen los recursos una vez se haya acabado la emisión de datos y se hayan gestionado todas las llamadas finales.

 

Para evitar fugas de memoria (memory leaks) forzaremos la liberación de recursos por si hay alguna instancia Disposable que no haya finalizado.

 

Una vez se ha ejecutado toda la emisión de temperaturas podemos observar como la interfaz se ha actualizado correctamente.

 

demo_rxAndroid_app

 

Gracias a este simple ejemplo hemos aprendido nociones básicas de la programación reactiva mediante las librerías RxJava 2 y RxAndroid. Así, de una manera fácil, hemos obtenido y generado datos en un hilo secundario y, automáticamente, los hemos obtenido en el hilo correspondiente (main) para que podamos actualizar la vista principal.

 

Esta es sólo la punta del iceberg de todo lo que nos puede ofrecer la programación reactiva ya que podemos, por ejemplo, en un mismo instante, acceder a base de datos, datos remotos y actualizaciones de interfaz en distintos hilos y responder de forma consecuente según los eventos que se produzcan.

 

El proyecto entero con el código se encuentra disponible en github

 

 

Públicado el 26/07/2017

Comparte este post: