SlideShare a Scribd company logo
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

An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and MockitoAn Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
shaunthomas999
 
Unit Testing in Java
Unit Testing in JavaUnit Testing in Java
Unit Testing in Java
Ahmed M. Gomaa
 
Java11 New Features
Java11 New FeaturesJava11 New Features
Java11 New Features
Haim Michael
 
Introduction to Design Patterns and Singleton
Introduction to Design Patterns and SingletonIntroduction to Design Patterns and Singleton
Introduction to Design Patterns and Singleton
Jonathan Simon
 
Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...
Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...
Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...
Edureka!
 
05 junit
05 junit05 junit
05 junit
mha4
 
Java Presentation For Syntax
Java Presentation For SyntaxJava Presentation For Syntax
Java Presentation For Syntax
PravinYalameli
 
Java 9 New Features
Java 9 New FeaturesJava 9 New Features
Java 9 New Features
Ali BAKAN
 
Test Driven Development (TDD) Preso 360|Flex 2010
Test Driven Development (TDD) Preso 360|Flex 2010Test Driven Development (TDD) Preso 360|Flex 2010
Test Driven Development (TDD) Preso 360|Flex 2010
guest5639fa9
 
The New JavaScript: ES6
The New JavaScript: ES6The New JavaScript: ES6
The New JavaScript: ES6
Rob Eisenberg
 
rx-java-presentation
rx-java-presentationrx-java-presentation
rx-java-presentation
Mateusz Bukowicz
 
Procedure and Function in PLSQL
Procedure and Function in PLSQLProcedure and Function in PLSQL
Procedure and Function in PLSQL
Arun Sial
 
C# 101: Intro to Programming with C#
C# 101: Intro to Programming with C#C# 101: Intro to Programming with C#
C# 101: Intro to Programming with C#
Hawkman Academy
 
Java 10 New Features
Java 10 New FeaturesJava 10 New Features
Java 10 New Features
Ali BAKAN
 
Interview Question & Answers for Selenium Freshers | LearningSlot
Interview Question & Answers for Selenium Freshers | LearningSlotInterview Question & Answers for Selenium Freshers | LearningSlot
Interview Question & Answers for Selenium Freshers | LearningSlot
Learning Slot
 
Core java
Core java Core java
Core java
Ravi varma
 
Exception Handling in C++
Exception Handling in C++Exception Handling in C++
Exception Handling in C++
Deepak Tathe
 
Java loops
Java loopsJava loops
Java loops
ricardovigan
 
Java Multithreading Using Executors Framework
Java Multithreading Using Executors FrameworkJava Multithreading Using Executors Framework
Java Multithreading Using Executors Framework
Arun Mehra
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
Helder da Rocha
 

What's hot (20)

An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and MockitoAn Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
An Introduction to JUnit 5 and how to use it with Spring boot tests and Mockito
 
Unit Testing in Java
Unit Testing in JavaUnit Testing in Java
Unit Testing in Java
 
Java11 New Features
Java11 New FeaturesJava11 New Features
Java11 New Features
 
Introduction to Design Patterns and Singleton
Introduction to Design Patterns and SingletonIntroduction to Design Patterns and Singleton
Introduction to Design Patterns and Singleton
 
Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...
Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...
Java Classes | Java Tutorial for Beginners | Java Classes and Objects | Java ...
 
05 junit
05 junit05 junit
05 junit
 
Java Presentation For Syntax
Java Presentation For SyntaxJava Presentation For Syntax
Java Presentation For Syntax
 
Java 9 New Features
Java 9 New FeaturesJava 9 New Features
Java 9 New Features
 
Test Driven Development (TDD) Preso 360|Flex 2010
Test Driven Development (TDD) Preso 360|Flex 2010Test Driven Development (TDD) Preso 360|Flex 2010
Test Driven Development (TDD) Preso 360|Flex 2010
 
The New JavaScript: ES6
The New JavaScript: ES6The New JavaScript: ES6
The New JavaScript: ES6
 
rx-java-presentation
rx-java-presentationrx-java-presentation
rx-java-presentation
 
Procedure and Function in PLSQL
Procedure and Function in PLSQLProcedure and Function in PLSQL
Procedure and Function in PLSQL
 
C# 101: Intro to Programming with C#
C# 101: Intro to Programming with C#C# 101: Intro to Programming with C#
C# 101: Intro to Programming with C#
 
Java 10 New Features
Java 10 New FeaturesJava 10 New Features
Java 10 New Features
 
Interview Question & Answers for Selenium Freshers | LearningSlot
Interview Question & Answers for Selenium Freshers | LearningSlotInterview Question & Answers for Selenium Freshers | LearningSlot
Interview Question & Answers for Selenium Freshers | LearningSlot
 
Core java
Core java Core java
Core java
 
Exception Handling in C++
Exception Handling in C++Exception Handling in C++
Exception Handling in C++
 
Java loops
Java loopsJava loops
Java loops
 
Java Multithreading Using Executors Framework
Java Multithreading Using Executors FrameworkJava Multithreading Using Executors Framework
Java Multithreading Using Executors Framework
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 

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 RxJava
Rick Warren
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
Tomáš 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 Slides
YarikS
 
Rxjava meetup presentation
Rxjava meetup presentationRxjava meetup presentation
Rxjava meetup presentation
Guillaume Valverde
 
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
JollyRogers5
 
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
Netesh 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
 
Rx java in action
Rx java in actionRx java in action
Rx java in action
Pratama Nur Wijaya
 
Saving lives with rx java
Saving lives with rx javaSaving lives with rx java
Saving lives with rx java
Shahar Barsheshet
 
RxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниRxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камни
Stfalcon Meetups
 
RxJava - Subject 入門
RxJava - Subject 入門RxJava - Subject 入門
RxJava - Subject 入門
Fumihiko Shiroyama
 
Akka.NET streams and reactive streams
Akka.NET streams and reactive streamsAkka.NET streams and reactive streams
Akka.NET streams and reactive streams
Bartosz 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 2015
Constantine Mars
 
Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)Reactive Java (GeeCON 2014)
Reactive Java (GeeCON 2014)
Tomasz Kowalczewski
 
Rxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJavaRxjava 介紹與 Android 中的 RxJava
Rxjava 介紹與 Android 中的 RxJava
Kros 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ới
Nexus FrontierTech
 
An Introduction to RxJava
An Introduction to RxJavaAn Introduction to RxJava
An Introduction to RxJava
Sanjay Acharya
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
Tomasz Kowalczewski
 
RxJava Applied
RxJava AppliedRxJava Applied
RxJava Applied
Igor Lozynskyi
 

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

Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !
Marcin Chrost
 
Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
Alberto Brandolini
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
sjcobrien
 
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdf
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdfTop Benefits of Using Salesforce Healthcare CRM for Patient Management.pdf
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdf
VALiNTRY360
 
Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...
Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...
Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...
Paul Brebner
 
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
kgyxske
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
Sven Peters
 
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
dakas1
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
rodomar2
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
Remote DBA Services
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
Green Software Development
 
WWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders AustinWWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders Austin
Patrick Weigel
 
How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
ToXSL Technologies
 
The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024
Yara Milbes
 
Kubernetes at Scale: Going Multi-Cluster with Istio
Kubernetes at Scale:  Going Multi-Cluster  with IstioKubernetes at Scale:  Going Multi-Cluster  with Istio
Kubernetes at Scale: Going Multi-Cluster with Istio
Severalnines
 
14 th Edition of International conference on computer vision
14 th Edition of International conference on computer vision14 th Edition of International conference on computer vision
14 th Edition of International conference on computer vision
ShulagnaSarkar2
 
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
kalichargn70th171
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
Bert Jan Schrijver
 
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
safelyiotech
 
Baha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdf
Baha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdfBaha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdf
Baha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdf
Baha Majid
 

Recently uploaded (20)

Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !Enums On Steroids - let's look at sealed classes !
Enums On Steroids - let's look at sealed classes !
 
Modelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - AmsterdamModelling Up - DDDEurope 2024 - Amsterdam
Modelling Up - DDDEurope 2024 - Amsterdam
 
Malibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed RoundMalibou Pitch Deck For Its €3M Seed Round
Malibou Pitch Deck For Its €3M Seed Round
 
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdf
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdfTop Benefits of Using Salesforce Healthcare CRM for Patient Management.pdf
Top Benefits of Using Salesforce Healthcare CRM for Patient Management.pdf
 
Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...
Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...
Why Apache Kafka Clusters Are Like Galaxies (And Other Cosmic Kafka Quandarie...
 
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
一比一原版(sdsu毕业证书)圣地亚哥州立大学毕业证如何办理
 
Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
 
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
一比一原版(UMN毕业证)明尼苏达大学毕业证如何办理
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
 
WWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders AustinWWDC 2024 Keynote Review: For CocoaCoders Austin
WWDC 2024 Keynote Review: For CocoaCoders Austin
 
How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?How Can Hiring A Mobile App Development Company Help Your Business Grow?
How Can Hiring A Mobile App Development Company Help Your Business Grow?
 
The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024The Rising Future of CPaaS in the Middle East 2024
The Rising Future of CPaaS in the Middle East 2024
 
Kubernetes at Scale: Going Multi-Cluster with Istio
Kubernetes at Scale:  Going Multi-Cluster  with IstioKubernetes at Scale:  Going Multi-Cluster  with Istio
Kubernetes at Scale: Going Multi-Cluster with Istio
 
14 th Edition of International conference on computer vision
14 th Edition of International conference on computer vision14 th Edition of International conference on computer vision
14 th Edition of International conference on computer vision
 
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf8 Best Automated Android App Testing Tool and Framework in 2024.pdf
8 Best Automated Android App Testing Tool and Framework in 2024.pdf
 
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
J-Spring 2024 - Going serverless with Quarkus, GraalVM native images and AWS ...
 
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
Safelyio Toolbox Talk Softwate & App (How To Digitize Safety Meetings)
 
Baha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdf
Baha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdfBaha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdf
Baha Majid WCA4Z IBM Z Customer Council Boston June 2024.pdf
 

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!