SlideShare une entreprise Scribd logo
1  sur  33
Télécharger pour lire hors ligne
Programación
Reactiva en Android

Oier Blasco Linares !
@oier!
Diciembre 2013
Contenido
•

Limitaciones de los componentes android.!

•

Introducción a RxJava.!

•

Concurrencia.!

•

Pros y Contras.!

•

Preguntas.
Limitaciones de los componentes Android
Intent Service

•

No especifica como notificar a los clientes.!

•

Ningún controlo sobre la concurrencia.!

•

No especifican método de gestión de errores.
AsyncTask

•

Implementación cambia dependiendo del la version de android.!

•

En la version actual se ejecutan en serie.!

•

Suelen ser fuente de context leak.!

•

No especifican método de gestión de errores/excepciones.
Programación reactiva
Programación reativa
Definición

“La programación reactiva es un paradigma de
programación orientado a flujos de datos y a la
propagación de cambios. “ Wikipedia
Programación imperativa
ejemplo

X = 10;!
y = x + 5;!
X= 20!
Cual es el valor de Y? 15
Programación reactiva
ejemplo

X = 10;!
Func<int> y = () -> {x + 5};!
X= 20!
Cual es el valor de Y? 25
RX JAVA
RxJava
•

Una librería para componer programas asíncronos y
basados en evento mediante el uso de secuencias
observables.!

•

Open source.!

•

Creada por Netflix.!

•

Un port de “Reactive extension” creadas por Microsoft.!

•

Observable / Observer como elementos basicos.
Observable
•

Una secuencia de valores , finita o infinita.!

•

Permite la subscripción de observer mediante el método
subscribe.!

•

Lazy evaluation.!
Observer
•

Extension del patron observer de GoF.!

•

Se subscribe a objectos que implemente el interfaz
Observable y reacciona a lo items que este emita.!

•

El observer “espera” de manera no bloquean los valores
emitidos por el Observable.!
!
Observer
Observer<String>

stringObserver = new Observer<String> {	

!

public void onNext(String value) {	
	System.out.println(“ NextValue : ” + value);	
}	
public void onCompleted() {	
	System.out.println(“Done!”);	
}	
public void onError(Throwable t) { 	
		 System.out.println(“ERROR!!!!!”);	
}	 	
}
Observable
Observable.create( new Observable.OnSubscribeFunc<String>() {	
!

public Subscription onSubscribe(Observer<? super String> observer) {	
	
	 	 	
observer.onNext("pedro@domain.com");	
observer.onNext("maria@domain.com");	
observer.onNext("juan@domain.com");	
observer.onNext("isa@domain.com");	
!

observer.onCompleted();	
!

return Subscriptions.empty();	
}	
!

});
Composición
Composición
•

Los Observables pueden modificados mediante operadores.!

•

Estos operadores permiten filtrar , combinar y transformar las
secuencias representadas por los Observables.!

•

Los operadores retornan otros observables con lo cual se pueden
concatenar para producir la secuencia de datos deseada.!

•

RxJava viene con más de 50 operadores.!

•

Es posible crear mas operadores para ajustarlos a nuestras necesidades.!

•

Los “Marble diagrams” se usan en la documentación de RxJava para
explicar el funcionamiento de los operadores de una forma gráfica. !
Observer de ejemplo
private static Observer<Integer> createIntegerObserver(){	
	 return new Observer<Integer>() {	
!

public void onCompleted() {	
	 System.out.println("Sequence complete");	
}	
!

	
	

public void onError(Throwable throwable) {	
	 String msg = throwable.getMessage();
	 	 System.out.println("Error: “+ msg);	
}	

!

public void onNext(Integer i) {	
	 	 System.out.println(i)	
	
}	
};	
}
Map

Transforma la secuencia mediante la función
Integer[] values = new Integer[]{1, 2, 3, 4, 5};	
Observable<Integer> numbers = Observable.from(values);	
!
numbers.map(new Func1<Integer, Integer>() {	
public Integer call(Integer i) {	
return i * i;	
}	
}).subscribe(observer);

Output:

1!
4!
9!
16!
25!
MapMany

Combina n secuencias mediante la función
Observable<String> myStockSymbols =
StocksService.myPortfolio();	
Observer<StockInfo> stockInfoObserver = createStockInfoObserver();	

!
myStockSymbols.mapMany(new Func1<String, Observable<StockInfo>>() {	
	
public Observable<StockInfo> call(String stockSymbol) {	
return StocksService.getLastQuotes(stockSymbol);	
}	

!
}).subscribe(stockInfoObserver);

Output:

[AAPL-> 25,730120]!
[GOOG -> 23,464752]!
[GOOG -> 11,255009]!
Sequence complete
Reduce

Aplica una función a cada item devolviendo únicamente el acumulado
Integer[] values = new Integer[]{1, 2, 3, 4, 5};	
Observable<Integer> numbers = Observable.from(values);	
Observer<Integer> observer = createIntegerObserver();	

!
numbers.reduce(new Func2<Integer, Integer, Integer>() {	
public Integer call(Integer a , Integer b) {	
return a + b;	
}	
}).subscribe(observer);

Output:

15!
Sequence
complete
Filter

Filtra la secuencia en base a la función suministrada
Integer[] values = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9};	
Observable<Integer> numbers = Observable.from(values);	
Observer<Integer> observer = createIntegerObserver();	

!
numbers.filter(new Func1<Integer, Boolean>() {	
public Boolean call(Integer i) {	
return (i % 2 == 0);	
}	
}).subscribe(observer);

Output:

2!
4!
6!
8!
Sequence complete
SkipWhile

No emite los valores hasta que una condición se cumple
Integer[] values = new Integer[]{1, 2, 3, 4, 5, 4, 3, 2, 1};
Observable<Integer> numbers = Observable.from(values);	

	

!
Observer<Integer> observer = createIntegerObserver();	
numbers.skipWhile(new Func1<Integer, Boolean>() {	
public Boolean call(Integer i) {	
return (i <4);	
}	
}).subscribe(observer);

Output:

4!
5!
4!
3!
2!
1!
Sequence complete
Take

Emite solo los N elementos de la lista
Integer[] values = new Integer[]{1, 2, 3, 4, 5, 4, 3,
2, 1};
	
Observable<Integer> numbers =
Observable.from(values);	
!
Observer<Integer> observer = createIntegerObserver();	
numbers.take(2).subscribe(observer);

Output:

1!
2!
Sequence complete
Distinct

Elimina los duplicados de la secuencia

Integer[] values = new Integer[]{1, 2, 1, 2, 3, 3, 4, 1, 2};	
Observable<Integer> numbers = Observable.from(values);	
Observer<Integer> observer =createIntegerObserver();	

!
numbers.distinct().subscribe(observer);

Output:

1!
2!
3!
4!
Sequence complete
Merge

Fusiona n secuencias
Observable<Integer> odds =	
	
	
Observable.from(new Integer[]{1, 3, 5, 7});	
Observable<Integer> evens = 	
	
	
Observable.from(new Integer[]{2,4,6});	
	
Observer<Integer> observer = createIntegerObserver();	
Observable.merge(odds,evens).subscribe(observer);

Output:

1!
3!
2!
5!
4!
7!
6!
Sequence complete
Zip

Combina n secuencias mediante la función

!

Observable<Integer> odds = Observable.from(new Integer[]{1, 3, 5, 7});	
Observable<Integer> evens = Observable.from(new Integer[]{2,4,6});	
Observer<String> observer = createStringObserver();	
	
Observable.zip(odds,evens ,new Func2<Integer, Integer, String>() {	
	
public String call(Integer a, Integer b) {	
return String.format("[%s,%s]",a,b);	
}	
}).subscribe(observer);	

Output:

[1, 2]!
[3, 4]!
[5, 6]!
Sequence complete
Concurrencia
Schedulers
•

Los observables son mono hilo (single threaded) por defecto.!

•

Los scheduler se usan para introducir la concurrencia permitiendo ejecutar
partes de nuestro cadena de observables concurrentemente.!

•

Hay dos aspectos de nuestros Observables de los que queremos poder
controlar la concurrencia:!
•

•

•

En la invocación de la subscripción. Para ello usaremos el método
Observable.observeOn(Scheduler s).!
En las notificaciones al Observer. Para ello usaremos el método
Observable.notifyOn(Scheduler s).!

Hay varia implementaciones de los schedulers. Ex:
CurrentThreadScheduler, ExecutorScheduler, NewThreadScheduler, …
Schedulers - Ejemplo
public class WeatherAPI	
!

public static Observable<WeatherData> getWeatherFromCities(String ... cities){	
return Observable.from(cities).map(new Func1<String,WeatherData>() {	
public WeatherData call(String s) {	
	

	

	

	
	

	

// Call to remote api	
return RemoteService.getWeatherData(s); 	
}	

}).subscribeOn(Schedulers.threadPoolForIO());	
}	
}
Schedulers - Ejemplo
String [] cities= { "Madrid","Barcelona","Bilbao"} ;
WeatherAPI.getWeatherFromCities(cities) 	
	 .observeOn(AndroidSchedulers.mainThread()) 	
	 .subscribe(new Observer<WeatherData>() {	
	
	

// Safe to call UI code from here	
public void onCompleted() { … }	
public void onError(Throwable throwable) { … }	
public void onNext(String s) {

}});

… }
Pros
•

Método simple y uniforme de tratar los eventos y los
errores (onNext, onError,onCompleted).!

•

Podemos crea APIS que mantengan el control sobre la
concurrencia .!

•

Facilmente Testeable.!

•

Reusable permite que el cliente extienda/adapte la
secuencia usando los operadores.!
Contras

•

Curva de aprendizaje.!

•

Sintaxis de java 6 ( Java 8 lo mejora pero no esta
disponible para programación en android).

Contenu connexe

Tendances

Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testingAgustin Ramos
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrentepuracastillo
 
SMA1011_BUBAL_Tipos de comportamiento
SMA1011_BUBAL_Tipos de comportamientoSMA1011_BUBAL_Tipos de comportamiento
SMA1011_BUBAL_Tipos de comportamientoxoanGz
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosWilliam Diaz S
 
Tipos De Comportamiento
Tipos De ComportamientoTipos De Comportamiento
Tipos De ComportamientoSegaAlex
 
Curso de programación iPhone: Cocoa-Touch
Curso de programación iPhone: Cocoa-TouchCurso de programación iPhone: Cocoa-Touch
Curso de programación iPhone: Cocoa-Touchfrr149
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesoskruskaya salazar
 

Tendances (14)

Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testing
 
Comunicación entre Procesos
Comunicación entre ProcesosComunicación entre Procesos
Comunicación entre Procesos
 
Statement
StatementStatement
Statement
 
Ios.s14
Ios.s14Ios.s14
Ios.s14
 
SQL Monitoring
SQL MonitoringSQL Monitoring
SQL Monitoring
 
Programacion concurrente
Programacion concurrenteProgramacion concurrente
Programacion concurrente
 
SMA1011_BUBAL_Tipos de comportamiento
SMA1011_BUBAL_Tipos de comportamientoSMA1011_BUBAL_Tipos de comportamiento
SMA1011_BUBAL_Tipos de comportamiento
 
Metodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a ObjetosMetodologia para resolver problemas con Programacion orientada a Objetos
Metodologia para resolver problemas con Programacion orientada a Objetos
 
Tipos De Comportamiento
Tipos De ComportamientoTipos De Comportamiento
Tipos De Comportamiento
 
Java 1.8:Road to Functional Language
Java 1.8:Road to Functional LanguageJava 1.8:Road to Functional Language
Java 1.8:Road to Functional Language
 
Curso de programación iPhone: Cocoa-Touch
Curso de programación iPhone: Cocoa-TouchCurso de programación iPhone: Cocoa-Touch
Curso de programación iPhone: Cocoa-Touch
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesos
 
Procesos
ProcesosProcesos
Procesos
 
Time Tables & MTBF
Time Tables & MTBFTime Tables & MTBF
Time Tables & MTBF
 

Similaire à Programación Reactiva en Android

Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)Iran Reyes Fleitas
 
Curso matlab
Curso matlabCurso matlab
Curso matlabklon1234
 
Node al limite con Nest
Node al limite con NestNode al limite con Nest
Node al limite con NestArturo Silvelo
 
Intro octave (1)
Intro octave (1)Intro octave (1)
Intro octave (1)miempresa7
 
Como leer planes de ejecución
Como leer planes de ejecuciónComo leer planes de ejecución
Como leer planes de ejecuciónSpanishPASSVC
 
Practicas en matlab
Practicas en matlabPracticas en matlab
Practicas en matlabbachispasaca
 
Curso Swift
Curso SwiftCurso Swift
Curso SwiftPlatzi
 
Resumen asignatura de Introducción a la Programación
Resumen asignatura de Introducción a la ProgramaciónResumen asignatura de Introducción a la Programación
Resumen asignatura de Introducción a la ProgramaciónOriol Borras Gene
 
DDAA FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)
DDAA   FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)DDAA   FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)
DDAA FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)Fernando Marcos Marcos
 
Matlab presentacion enero2012
Matlab presentacion enero2012Matlab presentacion enero2012
Matlab presentacion enero2012gerardoarbito
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
FdP_Diapositivas_2018
FdP_Diapositivas_2018FdP_Diapositivas_2018
FdP_Diapositivas_2018ead1943
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2Carlos Posada
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2Juan Cardona
 

Similaire à Programación Reactiva en Android (20)

Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)Getting deeper with TPL & async (Spanish version)
Getting deeper with TPL & async (Spanish version)
 
MODELO PASO DE MENSAJES
MODELO PASO DE MENSAJESMODELO PASO DE MENSAJES
MODELO PASO DE MENSAJES
 
Curso matlab
Curso matlabCurso matlab
Curso matlab
 
Algoritmos
Algoritmos Algoritmos
Algoritmos
 
Node al limite con Nest
Node al limite con NestNode al limite con Nest
Node al limite con Nest
 
Intro octave (1)
Intro octave (1)Intro octave (1)
Intro octave (1)
 
Javascript
JavascriptJavascript
Javascript
 
Como leer planes de ejecución
Como leer planes de ejecuciónComo leer planes de ejecución
Como leer planes de ejecución
 
Practicas en matlab
Practicas en matlabPracticas en matlab
Practicas en matlab
 
Curso Swift
Curso SwiftCurso Swift
Curso Swift
 
Resumen asignatura de Introducción a la Programación
Resumen asignatura de Introducción a la ProgramaciónResumen asignatura de Introducción a la Programación
Resumen asignatura de Introducción a la Programación
 
Rx js
Rx jsRx js
Rx js
 
DDAA FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)
DDAA   FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)DDAA   FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)
DDAA FPGA - Unidad Aritmetica Logica (Procesador de Numeros Enteros y Logicos)
 
Matlab presentacion enero2012
Matlab presentacion enero2012Matlab presentacion enero2012
Matlab presentacion enero2012
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Conceptos básicos de R
Conceptos básicos de RConceptos básicos de R
Conceptos básicos de R
 
FdP_Diapositivas_2018
FdP_Diapositivas_2018FdP_Diapositivas_2018
FdP_Diapositivas_2018
 
Working effectively with asynchronous code
Working effectively with asynchronous codeWorking effectively with asynchronous code
Working effectively with asynchronous code
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2
 
Taller de programación clase #2
Taller de programación   clase #2Taller de programación   clase #2
Taller de programación clase #2
 

Plus de Droidcon Spain

Concurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco ArañaConcurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco ArañaDroidcon Spain
 
Android: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia StudioAndroid: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia StudioDroidcon Spain
 
Me enamoré de un robot - Tecnilogica
Me enamoré de un robot - TecnilogicaMe enamoré de un robot - Tecnilogica
Me enamoré de un robot - TecnilogicaDroidcon Spain
 
Apps and cars - Applicantes
Apps and cars - ApplicantesApps and cars - Applicantes
Apps and cars - ApplicantesDroidcon Spain
 
Accesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - CodefactoryAccesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - CodefactoryDroidcon Spain
 
Visión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y AndroidVisión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y AndroidDroidcon Spain
 
Desvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon SpainDesvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon SpainDroidcon Spain
 
Monetize your idea! - Pay Pal
Monetize your idea! - Pay PalMonetize your idea! - Pay Pal
Monetize your idea! - Pay PalDroidcon Spain
 
Desarrollo ágil de apps con Genexus
Desarrollo ágil de apps con GenexusDesarrollo ágil de apps con Genexus
Desarrollo ágil de apps con GenexusDroidcon Spain
 
Metodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de appsMetodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de appsDroidcon Spain
 
Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d Droidcon Spain
 
Open tok Android sdk - Droidcon
Open tok Android sdk - DroidconOpen tok Android sdk - Droidcon
Open tok Android sdk - DroidconDroidcon Spain
 
Ui testing with espresso
Ui testing with espressoUi testing with espresso
Ui testing with espressoDroidcon Spain
 
Geolocalización en Android
Geolocalización en Android Geolocalización en Android
Geolocalización en Android Droidcon Spain
 
Cordova 3, apps para android
Cordova 3, apps para androidCordova 3, apps para android
Cordova 3, apps para androidDroidcon Spain
 
Requisitos de Accesibilidad
Requisitos de AccesibilidadRequisitos de Accesibilidad
Requisitos de AccesibilidadDroidcon Spain
 
Presentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENETPresentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENETDroidcon Spain
 
Droid con Aspace-Cross
Droid con Aspace-CrossDroid con Aspace-Cross
Droid con Aspace-CrossDroidcon Spain
 
Android UI design trends
Android UI design trendsAndroid UI design trends
Android UI design trendsDroidcon Spain
 

Plus de Droidcon Spain (20)

Concurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco ArañaConcurrency with Promise Style – Rayco Araña
Concurrency with Promise Style – Rayco Araña
 
Android: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia StudioAndroid: más allÁpp – inMedia Studio
Android: más allÁpp – inMedia Studio
 
Me enamoré de un robot - Tecnilogica
Me enamoré de un robot - TecnilogicaMe enamoré de un robot - Tecnilogica
Me enamoré de un robot - Tecnilogica
 
Apps and cars - Applicantes
Apps and cars - ApplicantesApps and cars - Applicantes
Apps and cars - Applicantes
 
Accesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - CodefactoryAccesibilidad en apps móviles - Codefactory
Accesibilidad en apps móviles - Codefactory
 
Visión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y AndroidVisión Artificial, Accesibilidad y Android
Visión Artificial, Accesibilidad y Android
 
Desvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon SpainDesvelando el GDK - Droidcon Spain
Desvelando el GDK - Droidcon Spain
 
Monetize your idea! - Pay Pal
Monetize your idea! - Pay PalMonetize your idea! - Pay Pal
Monetize your idea! - Pay Pal
 
Desarrollo ágil de apps con Genexus
Desarrollo ágil de apps con GenexusDesarrollo ágil de apps con Genexus
Desarrollo ágil de apps con Genexus
 
Metodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de appsMetodología Scrum para el desarrollo de apps
Metodología Scrum para el desarrollo de apps
 
Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d Introducción Tu Go and Open Tok - Telefónica i+d
Introducción Tu Go and Open Tok - Telefónica i+d
 
Tu go - Droidcon
Tu go - DroidconTu go - Droidcon
Tu go - Droidcon
 
Open tok Android sdk - Droidcon
Open tok Android sdk - DroidconOpen tok Android sdk - Droidcon
Open tok Android sdk - Droidcon
 
Ui testing with espresso
Ui testing with espressoUi testing with espresso
Ui testing with espresso
 
Geolocalización en Android
Geolocalización en Android Geolocalización en Android
Geolocalización en Android
 
Cordova 3, apps para android
Cordova 3, apps para androidCordova 3, apps para android
Cordova 3, apps para android
 
Requisitos de Accesibilidad
Requisitos de AccesibilidadRequisitos de Accesibilidad
Requisitos de Accesibilidad
 
Presentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENETPresentación Accesibilidad ASPACENET
Presentación Accesibilidad ASPACENET
 
Droid con Aspace-Cross
Droid con Aspace-CrossDroid con Aspace-Cross
Droid con Aspace-Cross
 
Android UI design trends
Android UI design trendsAndroid UI design trends
Android UI design trends
 

Dernier

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 

Dernier (15)

Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 

Programación Reactiva en Android

  • 1. Programación Reactiva en Android Oier Blasco Linares ! @oier! Diciembre 2013
  • 2. Contenido • Limitaciones de los componentes android.! • Introducción a RxJava.! • Concurrencia.! • Pros y Contras.! • Preguntas.
  • 3. Limitaciones de los componentes Android
  • 4. Intent Service • No especifica como notificar a los clientes.! • Ningún controlo sobre la concurrencia.! • No especifican método de gestión de errores.
  • 5. AsyncTask • Implementación cambia dependiendo del la version de android.! • En la version actual se ejecutan en serie.! • Suelen ser fuente de context leak.! • No especifican método de gestión de errores/excepciones.
  • 7. Programación reativa Definición “La programación reactiva es un paradigma de programación orientado a flujos de datos y a la propagación de cambios. “ Wikipedia
  • 8. Programación imperativa ejemplo X = 10;! y = x + 5;! X= 20! Cual es el valor de Y? 15
  • 9. Programación reactiva ejemplo X = 10;! Func<int> y = () -> {x + 5};! X= 20! Cual es el valor de Y? 25
  • 11. RxJava • Una librería para componer programas asíncronos y basados en evento mediante el uso de secuencias observables.! • Open source.! • Creada por Netflix.! • Un port de “Reactive extension” creadas por Microsoft.! • Observable / Observer como elementos basicos.
  • 12. Observable • Una secuencia de valores , finita o infinita.! • Permite la subscripción de observer mediante el método subscribe.! • Lazy evaluation.!
  • 13. Observer • Extension del patron observer de GoF.! • Se subscribe a objectos que implemente el interfaz Observable y reacciona a lo items que este emita.! • El observer “espera” de manera no bloquean los valores emitidos por el Observable.! !
  • 14. Observer Observer<String> stringObserver = new Observer<String> { ! public void onNext(String value) { System.out.println(“ NextValue : ” + value); } public void onCompleted() { System.out.println(“Done!”); } public void onError(Throwable t) { System.out.println(“ERROR!!!!!”); } }
  • 15. Observable Observable.create( new Observable.OnSubscribeFunc<String>() { ! public Subscription onSubscribe(Observer<? super String> observer) { observer.onNext("pedro@domain.com"); observer.onNext("maria@domain.com"); observer.onNext("juan@domain.com"); observer.onNext("isa@domain.com"); ! observer.onCompleted(); ! return Subscriptions.empty(); } ! });
  • 17. Composición • Los Observables pueden modificados mediante operadores.! • Estos operadores permiten filtrar , combinar y transformar las secuencias representadas por los Observables.! • Los operadores retornan otros observables con lo cual se pueden concatenar para producir la secuencia de datos deseada.! • RxJava viene con más de 50 operadores.! • Es posible crear mas operadores para ajustarlos a nuestras necesidades.! • Los “Marble diagrams” se usan en la documentación de RxJava para explicar el funcionamiento de los operadores de una forma gráfica. !
  • 18. Observer de ejemplo private static Observer<Integer> createIntegerObserver(){ return new Observer<Integer>() { ! public void onCompleted() { System.out.println("Sequence complete"); } ! public void onError(Throwable throwable) { String msg = throwable.getMessage(); System.out.println("Error: “+ msg); } ! public void onNext(Integer i) { System.out.println(i) } }; }
  • 19. Map Transforma la secuencia mediante la función Integer[] values = new Integer[]{1, 2, 3, 4, 5}; Observable<Integer> numbers = Observable.from(values); ! numbers.map(new Func1<Integer, Integer>() { public Integer call(Integer i) { return i * i; } }).subscribe(observer); Output: 1! 4! 9! 16! 25!
  • 20. MapMany Combina n secuencias mediante la función Observable<String> myStockSymbols = StocksService.myPortfolio(); Observer<StockInfo> stockInfoObserver = createStockInfoObserver(); ! myStockSymbols.mapMany(new Func1<String, Observable<StockInfo>>() { public Observable<StockInfo> call(String stockSymbol) { return StocksService.getLastQuotes(stockSymbol); } ! }).subscribe(stockInfoObserver); Output: [AAPL-> 25,730120]! [GOOG -> 23,464752]! [GOOG -> 11,255009]! Sequence complete
  • 21. Reduce Aplica una función a cada item devolviendo únicamente el acumulado Integer[] values = new Integer[]{1, 2, 3, 4, 5}; Observable<Integer> numbers = Observable.from(values); Observer<Integer> observer = createIntegerObserver(); ! numbers.reduce(new Func2<Integer, Integer, Integer>() { public Integer call(Integer a , Integer b) { return a + b; } }).subscribe(observer); Output: 15! Sequence complete
  • 22. Filter Filtra la secuencia en base a la función suministrada Integer[] values = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9}; Observable<Integer> numbers = Observable.from(values); Observer<Integer> observer = createIntegerObserver(); ! numbers.filter(new Func1<Integer, Boolean>() { public Boolean call(Integer i) { return (i % 2 == 0); } }).subscribe(observer); Output: 2! 4! 6! 8! Sequence complete
  • 23. SkipWhile No emite los valores hasta que una condición se cumple Integer[] values = new Integer[]{1, 2, 3, 4, 5, 4, 3, 2, 1}; Observable<Integer> numbers = Observable.from(values); ! Observer<Integer> observer = createIntegerObserver(); numbers.skipWhile(new Func1<Integer, Boolean>() { public Boolean call(Integer i) { return (i <4); } }).subscribe(observer); Output: 4! 5! 4! 3! 2! 1! Sequence complete
  • 24. Take Emite solo los N elementos de la lista Integer[] values = new Integer[]{1, 2, 3, 4, 5, 4, 3, 2, 1}; Observable<Integer> numbers = Observable.from(values); ! Observer<Integer> observer = createIntegerObserver(); numbers.take(2).subscribe(observer); Output: 1! 2! Sequence complete
  • 25. Distinct Elimina los duplicados de la secuencia Integer[] values = new Integer[]{1, 2, 1, 2, 3, 3, 4, 1, 2}; Observable<Integer> numbers = Observable.from(values); Observer<Integer> observer =createIntegerObserver(); ! numbers.distinct().subscribe(observer); Output: 1! 2! 3! 4! Sequence complete
  • 26. Merge Fusiona n secuencias Observable<Integer> odds = Observable.from(new Integer[]{1, 3, 5, 7}); Observable<Integer> evens = Observable.from(new Integer[]{2,4,6}); Observer<Integer> observer = createIntegerObserver(); Observable.merge(odds,evens).subscribe(observer); Output: 1! 3! 2! 5! 4! 7! 6! Sequence complete
  • 27. Zip Combina n secuencias mediante la función ! Observable<Integer> odds = Observable.from(new Integer[]{1, 3, 5, 7}); Observable<Integer> evens = Observable.from(new Integer[]{2,4,6}); Observer<String> observer = createStringObserver(); Observable.zip(odds,evens ,new Func2<Integer, Integer, String>() { public String call(Integer a, Integer b) { return String.format("[%s,%s]",a,b); } }).subscribe(observer); Output: [1, 2]! [3, 4]! [5, 6]! Sequence complete
  • 29. Schedulers • Los observables son mono hilo (single threaded) por defecto.! • Los scheduler se usan para introducir la concurrencia permitiendo ejecutar partes de nuestro cadena de observables concurrentemente.! • Hay dos aspectos de nuestros Observables de los que queremos poder controlar la concurrencia:! • • • En la invocación de la subscripción. Para ello usaremos el método Observable.observeOn(Scheduler s).! En las notificaciones al Observer. Para ello usaremos el método Observable.notifyOn(Scheduler s).! Hay varia implementaciones de los schedulers. Ex: CurrentThreadScheduler, ExecutorScheduler, NewThreadScheduler, …
  • 30. Schedulers - Ejemplo public class WeatherAPI ! public static Observable<WeatherData> getWeatherFromCities(String ... cities){ return Observable.from(cities).map(new Func1<String,WeatherData>() { public WeatherData call(String s) { // Call to remote api return RemoteService.getWeatherData(s); } }).subscribeOn(Schedulers.threadPoolForIO()); } }
  • 31. Schedulers - Ejemplo String [] cities= { "Madrid","Barcelona","Bilbao"} ; WeatherAPI.getWeatherFromCities(cities) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<WeatherData>() { // Safe to call UI code from here public void onCompleted() { … } public void onError(Throwable throwable) { … } public void onNext(String s) { }}); … }
  • 32. Pros • Método simple y uniforme de tratar los eventos y los errores (onNext, onError,onCompleted).! • Podemos crea APIS que mantengan el control sobre la concurrencia .! • Facilmente Testeable.! • Reusable permite que el cliente extienda/adapte la secuencia usando los operadores.!
  • 33. Contras • Curva de aprendizaje.! • Sintaxis de java 6 ( Java 8 lo mejora pero no esta disponible para programación en android).