SlideShare a Scribd company logo
1 of 50
Download to read offline
Reactive para Android
Elisa de Gregorio
¿Que es reactive?
- Se basa en que las apps son flujos de datos finitos o infinitos asíncronos.
- Nos abstrae
- Threading de bajo nivel
- Sincronización
- Estructuras de datos concurrentes
- Gestión de Errores *
- Nos permite concatenar transformaciones, componer datos de diferentes
fuentes de manera sencilla*
- Reactive- RXJava, RXJs, RX.NET, RXScala, RXPy …
- RXJava creado por Netflix
Ok show me now!
Time
Observer Observable
Subscribe
On Next *
OnError |
OnComplete
Ok show me now!
String adventure="Time";
Observable.just(adventure)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Ok show me now!
String adventure="Time";
Observable.just(adventure)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Crear el Observable
“Flujo de datos”
Ok show me now!
String adventure="Time";
Observable.just(adventure)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Te suscribes para
recoger los datos
LOG:
Time
Complete
Que Evita RXJava
Callbacks:
public class User{
String name;
String surname;
String fullName;
}
Que Evita RXJava
Callbacks:
public void changeName(final User user,final String
name,final Callback<User> callback ){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
user.setName(name);
callback.onSuccess(user);
}
}, SERVICE_LATENCY_IN_MILLIS);
}
public class User{
String name;
String surname;
String fullName;
}
Que Evita RXJava
Callbacks: User user = new User();
userRepository.changeName(user,
"Name", new Callback<User>() {
@Override
public void onSuccess(User item) {
//:D
}
@Override
public void onError() {
//D:
}
});
public void changeName(final User user,final String
name,final Callback<User> callback ){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
user.setName(name);
callback.onSuccess(user);
}
}, SERVICE_LATENCY_IN_MILLIS);
}
public class User{
String name;
String surname;
String fullName;
}
Que Evita RXJava
Callbacks: userRepository.changeName(user, "Name", new Callback<User>() {
@Override
public void onSuccess(User item) {
userRepository.changeSurname(item, "Surname", new Callback<User>() {
@Override
public void onSuccess(User item) {
//:D
}
@Override
public void onError() { //D: }
});
}
@Override
public void onError() { //D: }
});
public class User{
String name;
String surname;
String fullName;
}
Que Evita RXJava
Callbacks: userRepository.changeName(user, "Name", new Callback<User>() {
@Override
public void onSuccess(User item) {
userRepository.changeSurname(item, "Surname", new Callback<User>() {
@Override
public void onSuccess(User item) {
userRepository.changeFullname(item, item.getName(), item.getSurmane(),
new Callback<User>() {
@Override
public void onSuccess(User item) {
//Finish!
}
@Override
public void onError() {//D:
}
});
}
@Override
public void onError() {//D:
}
});
}
@Override
public void onError() {
}
});
public class User{
String name;
String surname;
String fullName;
}
Que Evita RXJava
Callbacks:
public class User{
String name;
String surname;
String fullName;
}
CALLBACK HELL!
userRepository.changeName(user, "Name", new Callback<User>() {
@Override
public void onSuccess(User item) {
userRepository.changeSurname(item, "Surname", new Callback<User>() {
@Override
public void onSuccess(User item) {
userRepository.changeFullname(item, item.getName(), item.getSurmane(),
new Callback<User>() {
@Override
public void onSuccess(User item) {
//Finish!
}
@Override
public void onError() {//D:
}
});
}
@Override
public void onError() {//D:
}
});
}
@Override
public void onError() {
}
});
y en RXJava ...
Callbacks:
public Observable<User> changeName(final User user,final String name) {
return Observable.fromCallable(new Callable<User>() {
@Override
public User call() throws Exception {
user.setName(name);
return user;
}
});
}
public class User{
String name;
String surname;
String fullName;
}
y en RXJava ...
Callbacks:
public class User{
String name;
String surname;
String fullName;
}
Observable.just(new User())
.flatMap(new Func1<User, Observable<User>>() {
@Override
public Observable<User> call(User user) {
return userRepository.changeName(user, "name");
}
}).flatMap(new Func1<User, Observable<User>>() {
@Override
public Observable<User> call(User user) {
return userRepository.changeSurname(user, "surname");
}
}).flatMap(new Func1<User, Observable<User>>() {
@Override
public Observable<User> call(User user) {
return userRepository.changeFullName(user, user.getName(), user.getSurmane());
}
}).subscribe(new Subscriber<User>() {
@Override
public void onCompleted() {//Finish
}
@Override
public void onError(Throwable e) { //D:
}
@Override
public void onNext(User user) { // :D
log(user);
}
});
en RXJava y retrolambda...o Kotlin ! :D
Callbacks:
Observable.just(new User())
.flatMap(user -> userRepository.changeName(user, "name"))
.flatMap(user -> userRepository.changeSurname(user, "surname"))
.flatMap(user ->
userRepository.changeFullName(user, user.getName(), user.getSurmane()))
.subscribe(user ->log(user));
public class User{
String name;
String surname;
String fullName;
}
RXJava
● Se compone:
○ Set de clases para representar streams de datos - Observables
○ Set de clases para escuchar las fuentes de datos - Subscribers
○ Set de clases para modificar y componer los datos
TimeObserver/subscriber Observable
Subscribe
On Next *
OrError |
OnComplete
RxJava Observable types
● Observable<T>
○ Emite 0-n items, termina con error, o completo
● Flowable<T> -RXJava2
○ Emite 0-n items, termina con error, o completo
○ Soporta BackPressure
● Single<T>
○ Emite exactamente 1 item or error
● Maybe<T>
○ Emite 0 items o 1 item o error
● Completable
○ Emite 0 items, solo una señal de completado o error
Flowable vs Observable
BackPessure: poder controlar la velocidad con la que source emite datos
RXJava 1:
● Solo estaban los Observables (implementaban BackPressure)
● MissingBackpressureException D:
○ Hay formas de evitarlo https://github.com/ReactiveX/RxJava/wiki/Backpressure
RXJava 2:
● Flowables
● Observable (No backPressure) - Flowables (Con backPressure)
Subscriptions
Subscribe un observer a un
observable:
Subscription subscribe()
Subscription subscribe(Action1<? super T> onNext)
Subscription subscribe(Observer<? super T> observer)
Subscription subscribe(Subscriber<? super T> subscriber)
Subscription subscribe(Action1<? super T> onNext,
Action1<java.lang.Throwable> onError)
Subscription subscribe(Action1<? super T> onNext,
Action1<java.lang.Throwable> onError, Action0 onComplete)
String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Subscriptions con memory leaks!
Sin problemas potenciales
Observable.just(1).subscribe(... this.something());
Memory Leak!!
Observable.interval(1, TimeUnit.SECONDS).subscribe(... this.something());
Subscriptions con memory leaks!
Sin problemas potenciales
Observable.just(1).subscribe(... this.something());
Memory Leak!!
Observable.interval(1, TimeUnit.SECONDS).subscribe(... this.something());
Solución:
RXJava1: Unsubscribe() RXJava2: Dispose()
RXJava1:CompositeSubscription RXJava2:CompositeDisposable
Schedulers String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Indican en qué hilo deben
ejecutarse las operaciones
Schedulers
Indican en qué hilo deben
ejecutarse las operaciones:
● Scheduler.immediate()
Crea un Scheduler que ejecuta
inmediatamente el trabajo en el
hilo actual
String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.inmediate())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Schedulers
Indican en qué hilo deben
ejecutarse las operaciones:
● Scheduler.immediate()
● Scheduler.trampoline()
Crea un Scheduler que coloca
el trabajo, en la cola del hilo
actual.
String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.trampoline())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Schedulers
Indican en qué hilo deben
ejecutarse las operaciones:
● Scheduler.immediate()
● Scheduler.trampoline()
● Scheduler.newThread()
Crea un Scheduler que crea un
nuevo hilo para realizar el
trabajo.
String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.newThead())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Schedulers
Indican en qué hilo deben
ejecutarse las operaciones:
● Scheduler.immediate()
● Scheduler.trampoline()
● Scheduler.newThread()
● Scheduler.computation()
Crea un Scheduler para trabajo
computacional, tiene tantos
hilos como CPU tenga el
dispositivo.
String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Schedulers
Indican en qué hilo deben
ejecutarse las operaciones:
● Scheduler.immediate()
● Scheduler.trampoline()
● Scheduler.newThread()
● Scheduler.computation()
● Scheduler.io()
Crea un Scheduler para
realizar llamadas I/O. Tiene un
thread-pool que crece a
demanda
String adventure="Time";
Observable.just(adventure)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
Log.d("Test", "COMPLETE");
}
@Override
public void onError(Throwable e) {
Log.e("Test", "ERROR");
}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Reactive operations
Reactive operations
http://reactivex.io/documentation/operators.html
● Crear Observables: Create, Defer, From, Interval, Just ...
● Transformar Observables: Buffer, FlatMap, Map, Scan ...
● Filtrar Observables: First, ElementAt, Distinct, Take …
● Combinar Observables: Join, CombineLatest, Zip…
● Errores: Catch, Retry
● Condicionales: All, Amb, Contains, DefaultIfEmpty…
● Matemáticos: Average, Concat, Count, Max, Reduce…
● BackPressure: Buffer, Sample, Window…
Crear Observables
RxJava tiene varios métodos para crear observables
● Observable.just("Hello")
● Observable.fromIterable()
● Observable.fromArray()
● Observable.fromCallable()
● Observable.fromFuture()
● Observable.interval()
Crear Observables
RxJava tiene varios métodos para crear observables
● Observable.just("Hello")
● Observable.fromIterable()
● Observable.fromArray()
● Observable.fromCallable()
● Observable.fromFuture()
● Observable.interval()
String adventure="Time";
Observable.just(adventure)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
Log : Time
String[] adventureTime={"what","time","is","it?"};
Observable.just(adventureTime)
.subscribe(new Subscriber<String[]>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(String[] s) {
Log.d("Test", s);
}
});
Log : Time [what,time, is,it]
Crear Observables
RxJava tiene varios métodos para crear observables
● Observable.just("Hello")
● Observable.fromArray()
● Observable.fromIterable()
● Observable.fromCallable()
● Observable.fromFuture()
● Observable.interval()
Log : Time what
time
is
it
String[] adventureTime={"what","time","is","it?"};
Observable.from(adventureTime)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
String adventure="Time";
Observable.just(adventure)
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(String s) {
Log.d("Test", s);
}
});
FlatMap
http://reactivex.io/documentation/operators/flatmap.html
FlatMap- Map-Zip
http://reactivex.io/documentation/operators/map.html | http://rxmarbles.com/#map
FlatMap- Map-Zip
http://reactivex.io/documentation/operators/zip.html | http://rxmarbles.com/#zip
Ejemplo Operaciones
Lista de usuarios de la charla
searchQuery(query)
.flatMap(new Func1<List<Users>, Observable<Users>>() {
@Override
public Observable<Users> call(List<Users> userList) {
return Observable.from(userList);
}
});
Ejemplo Operaciones
Lista de perfiles de usuarios de la charla
searchQuery(query)
.flatMap(new Func1<List<Users>, Observable<Users>>() {
@Override
public Observable<Users> call(List<Users> userList) {
return Observable.from(userList);
}
}).flatMap(new Func1<Users, Observable<LinkedINData>>() {
@Override
public Observable<LinkedINData> call(Users user) {
return linkedINQuery(user.getURL());
}
});
Ejemplo Operaciones
Lista de perfiles de usuarios de la charla
searchQuery(query)
.flatMap(new Func1<List<Users>, Observable<Users>>() {
@Override
public Observable<Users> call(List<Users> userList) {
return Observable.from(userList);
}
}).flatMap(new Func1<Users, Observable<LinkedINData>>() {
@Override
public Observable<LinkedINData> call(Users user) {
return linkedINQuery(user.getURL());
}
});
Ejemplo Operaciones
Lista de perfiles de usuarios de la charla que trabajan en Android
searchQuery(query)
.flatMap(new Func1<List<Users>, Observable<Users>>() {
@Override
public Observable<Users> call(List<Users> userList) {
return Observable.from(userList);
}
}).flatMap(new Func1<Users, Observable<LinkedINData>>() {
@Override
public Observable<LinkedINData> call(Users user) {
return linkedINQuery(user.getURL());
}).filter(new Func1<LinkedINData, Boolean>() {
@Override
public Boolean call(LinkedINData linkedINData) {
return linkedINData.worksInAndroid();
}
});
Ejemplo Operaciones
5 usuarios de la charla que trabajan en Android
searchQuery(query)
.flatMap(new Func1<List<Users>, Observable<Users>>() {
@Override
public Observable<Users> call(List<Users> userList) {
return Observable.from(userList);
}
}).flatMap(new Func1<Users, Observable<LinkedINData>>() {
@Override
public Observable<LinkedINData> call(Users user) {
return linkedINQuery(user.getURL());
}).filter(new Func1<LinkedINData, Boolean>() {
@Override
public Boolean call(LinkedINData linkedINData) {
return linkedINData.worksInAndroid();
}
}).take(5);
Ejemplo Operaciones
5 usuarios de la charla que trabajan en Android
searchQuery(query)
.flatMap(new Func1<List<Users>, Observable<Users>>() {
@Override
public Observable<Users> call(List<Users> userList) {
return Observable.from(userList);
}
}).flatMap(new Func1<Users, Observable<LinkedINData>>() {
@Override
public Observable<LinkedINData> call(Users user) {
return linkedINQuery(user.getURL());
}).filter(new Func1<LinkedINData, Boolean>() {
@Override
public Boolean call(LinkedINData linkedINData) {
return linkedINData.worksInAndroid();
}
}).take(5);
RXJava en la práctica
Data Domain View
Data
RXJava en la práctica
Repositorio
BD/API/... public interface GithubService {
String SERVICE_ENDPOINT = "https://api.github.com";
@GET("/users/{login}")
Observable<GithubEntity> getUser(@Path("login") String login);
}
Datasources
Retrofit y Realm
Data
RXJava en la práctica
Repositorio
BD/API/...
public Observable<Github> getGithubUser(String login){
return dataStoreFactory.getUser(login)
//Map the Api object to the Domain object
.flatMap(new Function<GithubEntity, Observable<Github>>() {
@Override
public Observable<Github> apply
(@NonNull GithubEntity githubEntity) throws Exception {
return userResponseMapper.responseToModel(githubEntity);
}
});
}
Datasources
Domain
RXJava en la práctica
Casos de uso
public Observable<Github> getGithubUser(String login){
return mGithubRepository.getUser(login);
}
Interactor
View
RXJava en la práctica
Activity/fragment
Presenter
Model
mGetUserUseCase.execute(“user_login”)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Github>() {
@Override
public void onCompleted() {
Log.d(TAG, "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError");
}
@Override
public void onNext(Github user) {
render(user);
}
});
RXTesting- Test Unitario- Dominio
@Before
public void setUp() throws Exception {
githubRepositoryMock = mock(GithubRepositoy.class);
mGetUserUseCase =new GetUserUseCaseImpl(githubRepositoryMock);
}
@Test
public void GetUserUseCase_Execute_GetGithubUser() throws Exception {
// Arrange
Github expectedGithub = new Github();
// Act
when(githubRepositoryMock.getUser("characterTest", 0)).thenReturn(Observable.just(expectedGithub));
Observable<Github> realGithubObj = mGetUserUseCase.execute("characterTest", 0);
TestSubscriber<Github> testSubscriber = new TestSubscriber<>();
realGithubObj.subscribe( testSubscriber);
// Assert
testSubscriber.assertNoErrors();
testSubscriber.assertValue(expectedGithub);
}
FIN!
Reactive para Android
Elisa de Gregorio

More Related Content

What's hot

Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...
Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...
Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...David Adi Nugroho
 
Konsep Routing - v2.pptx
Konsep Routing - v2.pptxKonsep Routing - v2.pptx
Konsep Routing - v2.pptxHasobrBlank
 
[ES] Control de versiones con subversion
[ES] Control de versiones con  subversion[ES] Control de versiones con  subversion
[ES] Control de versiones con subversionEudris Cabrera
 
Presentacion firewall
Presentacion firewallPresentacion firewall
Presentacion firewallJakol Inugami
 
Todos+los+comandos+que+hay+que+saber+para+configurar+un+router
Todos+los+comandos+que+hay+que+saber+para+configurar+un+routerTodos+los+comandos+que+hay+que+saber+para+configurar+un+router
Todos+los+comandos+que+hay+que+saber+para+configurar+un+routerjlzo
 
Materi 2 fungsi firewall pada jaringa n voip
Materi 2 fungsi firewall pada jaringa n voipMateri 2 fungsi firewall pada jaringa n voip
Materi 2 fungsi firewall pada jaringa n voipSitiFauriah
 
Administracion de redes servidor ftp
Administracion de redes   servidor ftpAdministracion de redes   servidor ftp
Administracion de redes servidor ftpYohany Acosta
 
Ejercicios obligatorios tema Redes e Internet Informática 4º ESO
Ejercicios obligatorios tema Redes e Internet Informática 4º ESOEjercicios obligatorios tema Redes e Internet Informática 4º ESO
Ejercicios obligatorios tema Redes e Internet Informática 4º ESOSonia Ballesteros
 
Firewall presentaciones exposicion
Firewall presentaciones exposicionFirewall presentaciones exposicion
Firewall presentaciones exposicionJONNATAN TORO
 
Comparación entre sistemas operativos.ppsx
Comparación entre sistemas operativos.ppsxComparación entre sistemas operativos.ppsx
Comparación entre sistemas operativos.ppsxabraham_albuja
 

What's hot (20)

Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...
Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...
Ngelab Packet Tracer - Subnet, IP, DHCP, Server, DNS, Email, NTP, FTP, RIP, E...
 
Konsep Routing - v2.pptx
Konsep Routing - v2.pptxKonsep Routing - v2.pptx
Konsep Routing - v2.pptx
 
[ES] Control de versiones con subversion
[ES] Control de versiones con  subversion[ES] Control de versiones con  subversion
[ES] Control de versiones con subversion
 
Firewall
FirewallFirewall
Firewall
 
Presentacion firewall
Presentacion firewallPresentacion firewall
Presentacion firewall
 
Evolución de java
Evolución de javaEvolución de java
Evolución de java
 
Subneteo de redes
Subneteo de redesSubneteo de redes
Subneteo de redes
 
Mail server
Mail serverMail server
Mail server
 
Todos+los+comandos+que+hay+que+saber+para+configurar+un+router
Todos+los+comandos+que+hay+que+saber+para+configurar+un+routerTodos+los+comandos+que+hay+que+saber+para+configurar+un+router
Todos+los+comandos+que+hay+que+saber+para+configurar+un+router
 
Instalasi kabel UTP untuk jaringan komputer
Instalasi kabel UTP untuk jaringan komputerInstalasi kabel UTP untuk jaringan komputer
Instalasi kabel UTP untuk jaringan komputer
 
Google chrome OS
Google chrome OS Google chrome OS
Google chrome OS
 
Materi 2 fungsi firewall pada jaringa n voip
Materi 2 fungsi firewall pada jaringa n voipMateri 2 fungsi firewall pada jaringa n voip
Materi 2 fungsi firewall pada jaringa n voip
 
Xampp
XamppXampp
Xampp
 
Administracion de redes servidor ftp
Administracion de redes   servidor ftpAdministracion de redes   servidor ftp
Administracion de redes servidor ftp
 
Ppt proxy
Ppt proxyPpt proxy
Ppt proxy
 
DNS server.ppt
DNS server.pptDNS server.ppt
DNS server.ppt
 
Ejercicios obligatorios tema Redes e Internet Informática 4º ESO
Ejercicios obligatorios tema Redes e Internet Informática 4º ESOEjercicios obligatorios tema Redes e Internet Informática 4º ESO
Ejercicios obligatorios tema Redes e Internet Informática 4º ESO
 
Firewall presentaciones exposicion
Firewall presentaciones exposicionFirewall presentaciones exposicion
Firewall presentaciones exposicion
 
Ud6 hoja5 correccion
Ud6 hoja5 correccionUd6 hoja5 correccion
Ud6 hoja5 correccion
 
Comparación entre sistemas operativos.ppsx
Comparación entre sistemas operativos.ppsxComparación entre sistemas operativos.ppsx
Comparación entre sistemas operativos.ppsx
 

Similar to Iniciación rx java

Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaRick Warren
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 
4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...
4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...
4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...PROIDEA
 
RxJava2 Slides
RxJava2 SlidesRxJava2 Slides
RxJava2 SlidesYarikS
 
Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2JollyRogers5
 
RxJava 2 Reactive extensions for the JVM
RxJava 2  Reactive extensions for the JVMRxJava 2  Reactive extensions for the JVM
RxJava 2 Reactive extensions for the JVMNetesh Kumar
 
Rx java2 - Should I use it?
Rx java2 - Should I use it?Rx java2 - Should I use it?
Rx java2 - Should I use it?Kamil Kucharski
 
RxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниRxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниStfalcon Meetups
 
Akka.NET streams and reactive streams
Akka.NET streams and reactive streamsAkka.NET streams and reactive streams
Akka.NET streams and reactive streamsBartosz Sypytkowski
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015Constantine Mars
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaKros Huang
 
Tech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn Tới
Tech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn TớiTech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn Tới
Tech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn TớiNexus FrontierTech
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJavaSanjay Acharya
 

Similar to Iniciación rx java (20)

Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...
4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...
4Developers 2015: Programowanie synchroniczne i asynchroniczne - dwa światy k...
 
RxJava2 Slides
RxJava2 SlidesRxJava2 Slides
RxJava2 Slides
 
Rxjava meetup presentation
Rxjava meetup presentationRxjava meetup presentation
Rxjava meetup presentation
 
Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2Intro to Reactive Thinking and RxJava 2
Intro to Reactive Thinking and RxJava 2
 
RxJava 2 Reactive extensions for the JVM
RxJava 2  Reactive extensions for the JVMRxJava 2  Reactive extensions for the JVM
RxJava 2 Reactive extensions for the JVM
 
Rx java2 - Should I use it?
Rx java2 - Should I use it?Rx java2 - Should I use it?
Rx java2 - Should I use it?
 
Rx java in action
Rx java in actionRx java in action
Rx java in action
 
Saving lives with rx java
Saving lives with rx javaSaving lives with rx java
Saving lives with rx java
 
RxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниRxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камни
 
RxJava - Subject 入門
RxJava - Subject 入門RxJava - Subject 入門
RxJava - Subject 入門
 
Akka.NET streams and reactive streams
Akka.NET streams and reactive streamsAkka.NET streams and reactive streams
Akka.NET streams and reactive streams
 
RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015RxJava for Android - GDG DevFest Ukraine 2015
RxJava for Android - GDG DevFest Ukraine 2015
 
Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
 
Tech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn Tới
Tech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn TớiTech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn Tới
Tech Talk #4 : RxJava and Using RxJava in MVP - Dương Văn Tới
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
 
RxJava Applied
RxJava AppliedRxJava Applied
RxJava Applied
 

Recently uploaded

KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noidabntitsolutionsrishis
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfLivetecs LLC
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)OPEN KNOWLEDGE GmbH
 

Recently uploaded (20)

KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in NoidaBuds n Tech IT Solutions: Top-Notch Web Services in Noida
Buds n Tech IT Solutions: Top-Notch Web Services in Noida
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
How to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdfHow to Track Employee Performance A Comprehensive Guide.pdf
How to Track Employee Performance A Comprehensive Guide.pdf
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)Der Spagat zwischen BIAS und FAIRNESS (2024)
Der Spagat zwischen BIAS und FAIRNESS (2024)
 

Iniciación rx java

  • 2. ¿Que es reactive? - Se basa en que las apps son flujos de datos finitos o infinitos asíncronos. - Nos abstrae - Threading de bajo nivel - Sincronización - Estructuras de datos concurrentes - Gestión de Errores * - Nos permite concatenar transformaciones, componer datos de diferentes fuentes de manera sencilla* - Reactive- RXJava, RXJs, RX.NET, RXScala, RXPy … - RXJava creado por Netflix
  • 3.
  • 4. Ok show me now! Time Observer Observable Subscribe On Next * OnError | OnComplete
  • 5. Ok show me now! String adventure="Time"; Observable.just(adventure) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 6. Ok show me now! String adventure="Time"; Observable.just(adventure) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } }); Crear el Observable “Flujo de datos”
  • 7. Ok show me now! String adventure="Time"; Observable.just(adventure) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } }); Te suscribes para recoger los datos LOG: Time Complete
  • 8. Que Evita RXJava Callbacks: public class User{ String name; String surname; String fullName; }
  • 9. Que Evita RXJava Callbacks: public void changeName(final User user,final String name,final Callback<User> callback ){ Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { user.setName(name); callback.onSuccess(user); } }, SERVICE_LATENCY_IN_MILLIS); } public class User{ String name; String surname; String fullName; }
  • 10. Que Evita RXJava Callbacks: User user = new User(); userRepository.changeName(user, "Name", new Callback<User>() { @Override public void onSuccess(User item) { //:D } @Override public void onError() { //D: } }); public void changeName(final User user,final String name,final Callback<User> callback ){ Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { user.setName(name); callback.onSuccess(user); } }, SERVICE_LATENCY_IN_MILLIS); } public class User{ String name; String surname; String fullName; }
  • 11. Que Evita RXJava Callbacks: userRepository.changeName(user, "Name", new Callback<User>() { @Override public void onSuccess(User item) { userRepository.changeSurname(item, "Surname", new Callback<User>() { @Override public void onSuccess(User item) { //:D } @Override public void onError() { //D: } }); } @Override public void onError() { //D: } }); public class User{ String name; String surname; String fullName; }
  • 12. Que Evita RXJava Callbacks: userRepository.changeName(user, "Name", new Callback<User>() { @Override public void onSuccess(User item) { userRepository.changeSurname(item, "Surname", new Callback<User>() { @Override public void onSuccess(User item) { userRepository.changeFullname(item, item.getName(), item.getSurmane(), new Callback<User>() { @Override public void onSuccess(User item) { //Finish! } @Override public void onError() {//D: } }); } @Override public void onError() {//D: } }); } @Override public void onError() { } }); public class User{ String name; String surname; String fullName; }
  • 13. Que Evita RXJava Callbacks: public class User{ String name; String surname; String fullName; } CALLBACK HELL! userRepository.changeName(user, "Name", new Callback<User>() { @Override public void onSuccess(User item) { userRepository.changeSurname(item, "Surname", new Callback<User>() { @Override public void onSuccess(User item) { userRepository.changeFullname(item, item.getName(), item.getSurmane(), new Callback<User>() { @Override public void onSuccess(User item) { //Finish! } @Override public void onError() {//D: } }); } @Override public void onError() {//D: } }); } @Override public void onError() { } });
  • 14. y en RXJava ... Callbacks: public Observable<User> changeName(final User user,final String name) { return Observable.fromCallable(new Callable<User>() { @Override public User call() throws Exception { user.setName(name); return user; } }); } public class User{ String name; String surname; String fullName; }
  • 15. y en RXJava ... Callbacks: public class User{ String name; String surname; String fullName; } Observable.just(new User()) .flatMap(new Func1<User, Observable<User>>() { @Override public Observable<User> call(User user) { return userRepository.changeName(user, "name"); } }).flatMap(new Func1<User, Observable<User>>() { @Override public Observable<User> call(User user) { return userRepository.changeSurname(user, "surname"); } }).flatMap(new Func1<User, Observable<User>>() { @Override public Observable<User> call(User user) { return userRepository.changeFullName(user, user.getName(), user.getSurmane()); } }).subscribe(new Subscriber<User>() { @Override public void onCompleted() {//Finish } @Override public void onError(Throwable e) { //D: } @Override public void onNext(User user) { // :D log(user); } });
  • 16. en RXJava y retrolambda...o Kotlin ! :D Callbacks: Observable.just(new User()) .flatMap(user -> userRepository.changeName(user, "name")) .flatMap(user -> userRepository.changeSurname(user, "surname")) .flatMap(user -> userRepository.changeFullName(user, user.getName(), user.getSurmane())) .subscribe(user ->log(user)); public class User{ String name; String surname; String fullName; }
  • 17. RXJava ● Se compone: ○ Set de clases para representar streams de datos - Observables ○ Set de clases para escuchar las fuentes de datos - Subscribers ○ Set de clases para modificar y componer los datos TimeObserver/subscriber Observable Subscribe On Next * OrError | OnComplete
  • 18. RxJava Observable types ● Observable<T> ○ Emite 0-n items, termina con error, o completo ● Flowable<T> -RXJava2 ○ Emite 0-n items, termina con error, o completo ○ Soporta BackPressure ● Single<T> ○ Emite exactamente 1 item or error ● Maybe<T> ○ Emite 0 items o 1 item o error ● Completable ○ Emite 0 items, solo una señal de completado o error
  • 19. Flowable vs Observable BackPessure: poder controlar la velocidad con la que source emite datos RXJava 1: ● Solo estaban los Observables (implementaban BackPressure) ● MissingBackpressureException D: ○ Hay formas de evitarlo https://github.com/ReactiveX/RxJava/wiki/Backpressure RXJava 2: ● Flowables ● Observable (No backPressure) - Flowables (Con backPressure)
  • 20. Subscriptions Subscribe un observer a un observable: Subscription subscribe() Subscription subscribe(Action1<? super T> onNext) Subscription subscribe(Observer<? super T> observer) Subscription subscribe(Subscriber<? super T> subscriber) Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError) Subscription subscribe(Action1<? super T> onNext, Action1<java.lang.Throwable> onError, Action0 onComplete) String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 21. Subscriptions con memory leaks! Sin problemas potenciales Observable.just(1).subscribe(... this.something()); Memory Leak!! Observable.interval(1, TimeUnit.SECONDS).subscribe(... this.something());
  • 22. Subscriptions con memory leaks! Sin problemas potenciales Observable.just(1).subscribe(... this.something()); Memory Leak!! Observable.interval(1, TimeUnit.SECONDS).subscribe(... this.something()); Solución: RXJava1: Unsubscribe() RXJava2: Dispose() RXJava1:CompositeSubscription RXJava2:CompositeDisposable
  • 23. Schedulers String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } }); Indican en qué hilo deben ejecutarse las operaciones
  • 24. Schedulers Indican en qué hilo deben ejecutarse las operaciones: ● Scheduler.immediate() Crea un Scheduler que ejecuta inmediatamente el trabajo en el hilo actual String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.inmediate()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 25. Schedulers Indican en qué hilo deben ejecutarse las operaciones: ● Scheduler.immediate() ● Scheduler.trampoline() Crea un Scheduler que coloca el trabajo, en la cola del hilo actual. String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.trampoline()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 26. Schedulers Indican en qué hilo deben ejecutarse las operaciones: ● Scheduler.immediate() ● Scheduler.trampoline() ● Scheduler.newThread() Crea un Scheduler que crea un nuevo hilo para realizar el trabajo. String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.newThead()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 27. Schedulers Indican en qué hilo deben ejecutarse las operaciones: ● Scheduler.immediate() ● Scheduler.trampoline() ● Scheduler.newThread() ● Scheduler.computation() Crea un Scheduler para trabajo computacional, tiene tantos hilos como CPU tenga el dispositivo. String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 28. Schedulers Indican en qué hilo deben ejecutarse las operaciones: ● Scheduler.immediate() ● Scheduler.trampoline() ● Scheduler.newThread() ● Scheduler.computation() ● Scheduler.io() Crea un Scheduler para realizar llamadas I/O. Tiene un thread-pool que crece a demanda String adventure="Time"; Observable.just(adventure) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { Log.d("Test", "COMPLETE"); } @Override public void onError(Throwable e) { Log.e("Test", "ERROR"); } @Override public void onNext(String s) { Log.d("Test", s); } });
  • 30. Reactive operations http://reactivex.io/documentation/operators.html ● Crear Observables: Create, Defer, From, Interval, Just ... ● Transformar Observables: Buffer, FlatMap, Map, Scan ... ● Filtrar Observables: First, ElementAt, Distinct, Take … ● Combinar Observables: Join, CombineLatest, Zip… ● Errores: Catch, Retry ● Condicionales: All, Amb, Contains, DefaultIfEmpty… ● Matemáticos: Average, Concat, Count, Max, Reduce… ● BackPressure: Buffer, Sample, Window…
  • 31. Crear Observables RxJava tiene varios métodos para crear observables ● Observable.just("Hello") ● Observable.fromIterable() ● Observable.fromArray() ● Observable.fromCallable() ● Observable.fromFuture() ● Observable.interval()
  • 32. Crear Observables RxJava tiene varios métodos para crear observables ● Observable.just("Hello") ● Observable.fromIterable() ● Observable.fromArray() ● Observable.fromCallable() ● Observable.fromFuture() ● Observable.interval() String adventure="Time"; Observable.just(adventure) .subscribe(new Subscriber<String>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(String s) { Log.d("Test", s); } }); Log : Time String[] adventureTime={"what","time","is","it?"}; Observable.just(adventureTime) .subscribe(new Subscriber<String[]>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(String[] s) { Log.d("Test", s); } }); Log : Time [what,time, is,it]
  • 33. Crear Observables RxJava tiene varios métodos para crear observables ● Observable.just("Hello") ● Observable.fromArray() ● Observable.fromIterable() ● Observable.fromCallable() ● Observable.fromFuture() ● Observable.interval() Log : Time what time is it String[] adventureTime={"what","time","is","it?"}; Observable.from(adventureTime) .subscribe(new Subscriber<String>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(String s) { Log.d("Test", s); } }); String adventure="Time"; Observable.just(adventure) .subscribe(new Subscriber<String>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(String s) { Log.d("Test", s); } });
  • 37. Ejemplo Operaciones Lista de usuarios de la charla searchQuery(query) .flatMap(new Func1<List<Users>, Observable<Users>>() { @Override public Observable<Users> call(List<Users> userList) { return Observable.from(userList); } });
  • 38. Ejemplo Operaciones Lista de perfiles de usuarios de la charla searchQuery(query) .flatMap(new Func1<List<Users>, Observable<Users>>() { @Override public Observable<Users> call(List<Users> userList) { return Observable.from(userList); } }).flatMap(new Func1<Users, Observable<LinkedINData>>() { @Override public Observable<LinkedINData> call(Users user) { return linkedINQuery(user.getURL()); } });
  • 39. Ejemplo Operaciones Lista de perfiles de usuarios de la charla searchQuery(query) .flatMap(new Func1<List<Users>, Observable<Users>>() { @Override public Observable<Users> call(List<Users> userList) { return Observable.from(userList); } }).flatMap(new Func1<Users, Observable<LinkedINData>>() { @Override public Observable<LinkedINData> call(Users user) { return linkedINQuery(user.getURL()); } });
  • 40. Ejemplo Operaciones Lista de perfiles de usuarios de la charla que trabajan en Android searchQuery(query) .flatMap(new Func1<List<Users>, Observable<Users>>() { @Override public Observable<Users> call(List<Users> userList) { return Observable.from(userList); } }).flatMap(new Func1<Users, Observable<LinkedINData>>() { @Override public Observable<LinkedINData> call(Users user) { return linkedINQuery(user.getURL()); }).filter(new Func1<LinkedINData, Boolean>() { @Override public Boolean call(LinkedINData linkedINData) { return linkedINData.worksInAndroid(); } });
  • 41. Ejemplo Operaciones 5 usuarios de la charla que trabajan en Android searchQuery(query) .flatMap(new Func1<List<Users>, Observable<Users>>() { @Override public Observable<Users> call(List<Users> userList) { return Observable.from(userList); } }).flatMap(new Func1<Users, Observable<LinkedINData>>() { @Override public Observable<LinkedINData> call(Users user) { return linkedINQuery(user.getURL()); }).filter(new Func1<LinkedINData, Boolean>() { @Override public Boolean call(LinkedINData linkedINData) { return linkedINData.worksInAndroid(); } }).take(5);
  • 42. Ejemplo Operaciones 5 usuarios de la charla que trabajan en Android searchQuery(query) .flatMap(new Func1<List<Users>, Observable<Users>>() { @Override public Observable<Users> call(List<Users> userList) { return Observable.from(userList); } }).flatMap(new Func1<Users, Observable<LinkedINData>>() { @Override public Observable<LinkedINData> call(Users user) { return linkedINQuery(user.getURL()); }).filter(new Func1<LinkedINData, Boolean>() { @Override public Boolean call(LinkedINData linkedINData) { return linkedINData.worksInAndroid(); } }).take(5);
  • 43. RXJava en la práctica Data Domain View
  • 44. Data RXJava en la práctica Repositorio BD/API/... public interface GithubService { String SERVICE_ENDPOINT = "https://api.github.com"; @GET("/users/{login}") Observable<GithubEntity> getUser(@Path("login") String login); } Datasources Retrofit y Realm
  • 45. Data RXJava en la práctica Repositorio BD/API/... public Observable<Github> getGithubUser(String login){ return dataStoreFactory.getUser(login) //Map the Api object to the Domain object .flatMap(new Function<GithubEntity, Observable<Github>>() { @Override public Observable<Github> apply (@NonNull GithubEntity githubEntity) throws Exception { return userResponseMapper.responseToModel(githubEntity); } }); } Datasources
  • 46. Domain RXJava en la práctica Casos de uso public Observable<Github> getGithubUser(String login){ return mGithubRepository.getUser(login); } Interactor
  • 47. View RXJava en la práctica Activity/fragment Presenter Model mGetUserUseCase.execute(“user_login”) .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Github>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted"); } @Override public void onError(Throwable e) { Log.e(TAG, "onError"); } @Override public void onNext(Github user) { render(user); } });
  • 48. RXTesting- Test Unitario- Dominio @Before public void setUp() throws Exception { githubRepositoryMock = mock(GithubRepositoy.class); mGetUserUseCase =new GetUserUseCaseImpl(githubRepositoryMock); } @Test public void GetUserUseCase_Execute_GetGithubUser() throws Exception { // Arrange Github expectedGithub = new Github(); // Act when(githubRepositoryMock.getUser("characterTest", 0)).thenReturn(Observable.just(expectedGithub)); Observable<Github> realGithubObj = mGetUserUseCase.execute("characterTest", 0); TestSubscriber<Github> testSubscriber = new TestSubscriber<>(); realGithubObj.subscribe( testSubscriber); // Assert testSubscriber.assertNoErrors(); testSubscriber.assertValue(expectedGithub); }
  • 49. FIN!