SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
RxJava
Um pouco sobre programação assíncrona e streams
1
O objetivo dessa apresentação é
mostrar um pouco do poder do
RxJava o porque dele ser incrível
2
Quem sou eu
• Clêrton Leal
• Nascido e criado em Fortaleza
• Vivendo em Belo Horizonte a pouco mais de 2 meses
• Atualmente trabalhando como consultor para Avenue Code
3
Um pouco de história
Será rápido eu prometo =)
4
Reactive Extensions é uma biblioteca, de programação
orientada a eventos, desenvolvida pela Microsoft e liberada
para o .NET framework em 2011.
Implementa e extende o padrão Observable clássico, porem
com um tratamento mais refinado para threads.
5
Em 2012 a Netflix adota o uso de Reactive Extensions para
seus módulos escritos em .NET e fica surpresa com a
facilidade de programação assíncrona.
Em 2013 a Netflix libera um projeto open source chamado
RxJava, uma implementação da especificação RX para Java.
Possibilitando assim o uso de RX em todos os seus módulos
escritos em Java e Scala.
6
Linguagems
7
• Java: RxJava
• JavaScript: RxJS
• C#: Rx.NET
• C#(Unity): UniRx
• Scala: RxScala
• Clojure: RxClojure
• C++: RxCpp
8
• Ruby: Rx.rb
• Python: RxPY
• Groovy: RxGroovy
• JRuby: RxJRuby
• Kotlin: RxKotlin
• Swift: RxSwift
• PHP: RxPHP
9
Uma sintaxe única
para todas as
linguagens
10
RxJava
Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> observer) {
try {
for (int i = 1; i < 5; i++) {
observer.onNext(i);
}
observer.onCompleted();
} catch (Exception e) {
observer.onError(e);
}
}
} );
11
RxGroovy
def myObservable = Observable.create({ aSubscriber ->
try {
for (int i = 1; i < 5; i++) {
aSubscriber.onNext(i);
}
aSubscriber.onCompleted();
} catch(Throwable t) {
aSubscriber.onError(t);
}
})
12
RxSwift
let source = Observable.create { observer in
do {
for i in 1...5 {
observer.on(.Next(i))
}
observer.on(.Completed)
} catch {
observer.on(.Error)
}
}
13
Qual a grande jogada do RxJava
14
15
RX trás a união e
expansão de dois
padrões de projeto
16
Observable
17
Iterator
18
Observable extendido
19
Adicionando a isso
funções de
transformação e
tratamento
assíncrono de dados
20
Entre o Observable e
o Subscriber
podemos aplicar
diversas funções de
transformação
21
Um pequeno
disclaimer sobre Java
8
22
Aplicando um filtro
String[] search = {"google", "microsoft"};
Observable.from(search)
.filter(s -> s.contains("g"))
.subscribe(s -> {
Log.d(TAG, s);
});
23
24
Vamos adicionar o
controle de threads
25
String[] search = {"google", "microsoft"};
Observable.from(search)
.filter(s -> complexAndSlowFilter(s))
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> {
Log.d(TAG, s);
});
26
Schedulers
• Schedulers.computation() - Usado para ações em CPU
bound em multi thread.
• Schedulers.io() - Usado para ações em IO bound.
• Schedulers.newThread() - Execução em nova thread.
• Schedulers.immediate() - Execução na thread atual.
• Schedulers.trampoline() - Execução na thread atual, mas
apenas após outras ações enfileiradas.
27
Schedulers
AndroidSchedulers.mainThread()
Main thread de uma aplicação Android.
28
Vamos para um
exemplo pratico
29
Em quantas linhas?
• Campo de texto irá buscar em um
serviço web
• Buscas feitas apenas com pelo
menos 3 caracteres
• Buscas feitas apenas quando o
usuário passar 500 milissegundos
sem digitar
30
Precisamos criar um observable
do SearchView
public Observable<String> getSearchObservable(SearchView searchView) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
subscriber.onNext(newText);
return true;
}
});
}
});
}
31
E depois aplicar algumas
transformações
public Observable<String> getSearchObservable(SearchView searchView) {
return Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
subscriber.onNext(newText);
return true;
}
});
}
}).filter(s -> fragment != null)
.map(s -> "http://search.com.br/" + s)
.filter(s -> s.length() >= 3)
.debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.computation());
32
E apenas isso na sua camada de
visão
getSearchObservable(searchField).subscribe(s -> {
doRequest();
})
33
Vamos ver alguns
truques legais com
RxJava
34
Facil de cancelar
• Sempre que chamamos o método subscribe(), o retorno do
mesmo é uma Subscription.
• Uma subscription pode ser facilmente cancelada.
Subscription subscription = getSearchObservable(searchField).subscribe(s -> {
doRequest();
});
subscription.unsubscribe();
35
Morte a AsyncTask
36
AsyncTasks são
tóxicas para o seu
código.
37
AsyncTask<String, String, User> asyncTask = new AsyncTask<String, String, User>() {
@Override
protected void onPreExecute() {
// Show a progress dialog
}
@Override
protected User doInBackground(String... params) {
return getUserSync(params[0]);
}
@Override
protected void onPostExecute(User s) {
// Update the UI
}
@Override
protected void onProgressUpdate(String... values) {
// Notify progress
}
};
38
Método getUser
public Observable<User> getUser(String name) {
return Observable.create((Observable.OnSubscribe<User>) subscriber -> {
try {
User user = getUserSync(name);
subscriber.onNext(user);
subscriber.onCompleted();
} catch (IOException e) {
subscriber.onError(e);
}
}).subscribeOn(Schedulers.io());
}
39
Consumindo getUser
private void doRequest() {
getUser("José")
.observeOn(AndroidSchedulers.mainThread())
.subscribe(user -> {
updateUi(user);
}, throwable -> {
handleError(throwable);
});
}
40
Ou apenas use o Retrofit
@GET("/{name}")
Observable<User> getUser(@Path("name") String name);
41
Morte a TimerTask
42
Um timer simples com RxJava
Subscription subscription = Observable.timer(START_DELAY, POLL_INTERVAL, TimeUnit.SECONDS)
.subscribe(aLong -> {
Log.d(TAG, String.valueOf(aLong));
});
subscription.unsubscribe();
43
A simplicidade de
fazer tarefas de forma
assíncrona abre novas
possibilidades
44
Qualquer operação de IO deve ser
realizada em uma thread
separada. Isso inclui acesso a
banco de dados e
SharedPreferences
45
O maior motivo se
adotar RxJava é o
suporte da
comunidade
46
Existem muitas bibliotecas com
Suporte a RxJava
• Retrofit: https://github.com/square/retrofit
• RxBinding: https://github.com/JakeWharton/RxBinding
• SqlBrite: https://github.com/square/sqlbrite
• Rx-preferences: https://github.com/f2prateek/rx-
preferences
47
Obrigado =)
Contatos
• clertonleal@gmail.com
• clertonleal
48

Weitere ähnliche Inhalte

Andere mochten auch

Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoLeonardo Borges
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlinShem Magnezi
 
Um algoritmo genético para o problema de roteamento de veículos
Um algoritmo genético para o problema de roteamento de veículosUm algoritmo genético para o problema de roteamento de veículos
Um algoritmo genético para o problema de roteamento de veículosPaulo Remoli
 
Getting started-kotlin-android
Getting started-kotlin-androidGetting started-kotlin-android
Getting started-kotlin-androidLucas Albuquerque
 
From Hackathons to Startups: Building Products from Fresh Ideas
From Hackathons to Startups: Building Products from Fresh IdeasFrom Hackathons to Startups: Building Products from Fresh Ideas
From Hackathons to Startups: Building Products from Fresh IdeasChris Traganos
 
Kotlin, smarter development for the jvm
Kotlin, smarter development for the jvmKotlin, smarter development for the jvm
Kotlin, smarter development for the jvmArnaud Giuliani
 
First few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesFirst few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesNebojša Vukšić
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyMobileAcademy
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & designallegro.tech
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaAli Muzaffar
 
NetflixOSS season 2 episode 2 - Reactive / Async
NetflixOSS   season 2 episode 2 - Reactive / AsyncNetflixOSS   season 2 episode 2 - Reactive / Async
NetflixOSS season 2 episode 2 - Reactive / AsyncRuslan Meshenberg
 
Genetic Algorithm by Example
Genetic Algorithm by ExampleGenetic Algorithm by Example
Genetic Algorithm by ExampleNobal Niraula
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaNelson Glauber Leal
 
Scala Data Pipelines for Music Recommendations
Scala Data Pipelines for Music RecommendationsScala Data Pipelines for Music Recommendations
Scala Data Pipelines for Music RecommendationsChris Johnson
 
The Top Skills That Can Get You Hired in 2017
The Top Skills That Can Get You Hired in 2017The Top Skills That Can Get You Hired in 2017
The Top Skills That Can Get You Hired in 2017LinkedIn
 

Andere mochten auch (19)

Programação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncronoProgramação functional reativa: lidando com código assíncrono
Programação functional reativa: lidando com código assíncrono
 
Building android apps with kotlin
Building android apps with kotlinBuilding android apps with kotlin
Building android apps with kotlin
 
Introdução ao Git
Introdução ao GitIntrodução ao Git
Introdução ao Git
 
Kotlin на практике
Kotlin на практикеKotlin на практике
Kotlin на практике
 
Um algoritmo genético para o problema de roteamento de veículos
Um algoritmo genético para o problema de roteamento de veículosUm algoritmo genético para o problema de roteamento de veículos
Um algoritmo genético para o problema de roteamento de veículos
 
Annotation processing
Annotation processingAnnotation processing
Annotation processing
 
Getting started-kotlin-android
Getting started-kotlin-androidGetting started-kotlin-android
Getting started-kotlin-android
 
From Hackathons to Startups: Building Products from Fresh Ideas
From Hackathons to Startups: Building Products from Fresh IdeasFrom Hackathons to Startups: Building Products from Fresh Ideas
From Hackathons to Startups: Building Products from Fresh Ideas
 
Kotlin, smarter development for the jvm
Kotlin, smarter development for the jvmKotlin, smarter development for the jvm
Kotlin, smarter development for the jvm
 
First few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examplesFirst few months with Kotlin - Introduction through android examples
First few months with Kotlin - Introduction through android examples
 
Kotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRreadyKotlin for Android - Vali Iorgu - mRready
Kotlin for Android - Vali Iorgu - mRready
 
RxJava - introduction & design
RxJava - introduction & designRxJava - introduction & design
RxJava - introduction & design
 
Reactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJavaReactive Programming on Android - RxAndroid - RxJava
Reactive Programming on Android - RxAndroid - RxJava
 
NetflixOSS season 2 episode 2 - Reactive / Async
NetflixOSS   season 2 episode 2 - Reactive / AsyncNetflixOSS   season 2 episode 2 - Reactive / Async
NetflixOSS season 2 episode 2 - Reactive / Async
 
Genetic Algorithm by Example
Genetic Algorithm by ExampleGenetic Algorithm by Example
Genetic Algorithm by Example
 
Lean Startup for Agile Product Management
Lean Startup for Agile Product ManagementLean Startup for Agile Product Management
Lean Startup for Agile Product Management
 
Desenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certaDesenvolvimento Android: Faça da maneira certa
Desenvolvimento Android: Faça da maneira certa
 
Scala Data Pipelines for Music Recommendations
Scala Data Pipelines for Music RecommendationsScala Data Pipelines for Music Recommendations
Scala Data Pipelines for Music Recommendations
 
The Top Skills That Can Get You Hired in 2017
The Top Skills That Can Get You Hired in 2017The Top Skills That Can Get You Hired in 2017
The Top Skills That Can Get You Hired in 2017
 

Ähnlich wie RxJava - Programação assíncrona para Android.

Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na PráticaEiti Kimura
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Práticatdc-globalcode
 
Orientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a PraticaOrientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a Praticaelliando dias
 
Orientacao A Objetos Da Teoria A Pratica Em Java
Orientacao A Objetos   Da Teoria A Pratica Em JavaOrientacao A Objetos   Da Teoria A Pratica Em Java
Orientacao A Objetos Da Teoria A Pratica Em Javaelliando dias
 
Orientação a objetos da teoria a prática em java
Orientação a objetos   da teoria a prática em java Orientação a objetos   da teoria a prática em java
Orientação a objetos da teoria a prática em java Fabiano Lima
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_jsgustavobeavis
 
Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Alexandre Tarifa
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Anderson Araújo
 
Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)Marcus Lacerda
 
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de MicroservicesDeep Tech Brasil
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingEder Magalhães
 
Tdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptMarcos Artigas
 
InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time Umbler
 

Ähnlich wie RxJava - Programação assíncrona para Android. (20)

Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
[TDC2016] Apache SparkMLlib:  Machine Learning na Prática[TDC2016] Apache SparkMLlib:  Machine Learning na Prática
[TDC2016] Apache SparkMLlib: Machine Learning na Prática
 
TDC2016SP - SparkMLlib Machine Learning na Prática
TDC2016SP -  SparkMLlib Machine Learning na PráticaTDC2016SP -  SparkMLlib Machine Learning na Prática
TDC2016SP - SparkMLlib Machine Learning na Prática
 
Orientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a PraticaOrientação a Objetos - Da Teoria a Pratica
Orientação a Objetos - Da Teoria a Pratica
 
Orientacao A Objetos Da Teoria A Pratica Em Java
Orientacao A Objetos   Da Teoria A Pratica Em JavaOrientacao A Objetos   Da Teoria A Pratica Em Java
Orientacao A Objetos Da Teoria A Pratica Em Java
 
Orientação a objetos da teoria a prática em java
Orientação a objetos   da teoria a prática em java Orientação a objetos   da teoria a prática em java
Orientação a objetos da teoria a prática em java
 
Indo alem do_mvc_node_js
Indo alem do_mvc_node_jsIndo alem do_mvc_node_js
Indo alem do_mvc_node_js
 
Introdução Play framework
Introdução Play frameworkIntrodução Play framework
Introdução Play framework
 
Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010
 
Como escolher o Framework Java para web?
Como escolher o Framework Java para web?Como escolher o Framework Java para web?
Como escolher o Framework Java para web?
 
Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)Monitoramento em tempo real (DEVDAY2015)
Monitoramento em tempo real (DEVDAY2015)
 
Introdução ao struts 2
Introdução ao struts 2Introdução ao struts 2
Introdução ao struts 2
 
Framework struts2v2.5
Framework struts2v2.5Framework struts2v2.5
Framework struts2v2.5
 
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Netflix hystrix
Netflix hystrixNetflix hystrix
Netflix hystrix
 
JavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computingJavaEE 7, na era do cloud computing
JavaEE 7, na era do cloud computing
 
Tdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.pptTdc2016 trilha-banco-influx.ppt
Tdc2016 trilha-banco-influx.ppt
 
InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time InfluxDb: como monitorar milhares de dados por segundo em real time
InfluxDb: como monitorar milhares de dados por segundo em real time
 
Sql proficiente
Sql proficienteSql proficiente
Sql proficiente
 

RxJava - Programação assíncrona para Android.

  • 1. RxJava Um pouco sobre programação assíncrona e streams 1
  • 2. O objetivo dessa apresentação é mostrar um pouco do poder do RxJava o porque dele ser incrível 2
  • 3. Quem sou eu • Clêrton Leal • Nascido e criado em Fortaleza • Vivendo em Belo Horizonte a pouco mais de 2 meses • Atualmente trabalhando como consultor para Avenue Code 3
  • 4. Um pouco de história Será rápido eu prometo =) 4
  • 5. Reactive Extensions é uma biblioteca, de programação orientada a eventos, desenvolvida pela Microsoft e liberada para o .NET framework em 2011. Implementa e extende o padrão Observable clássico, porem com um tratamento mais refinado para threads. 5
  • 6. Em 2012 a Netflix adota o uso de Reactive Extensions para seus módulos escritos em .NET e fica surpresa com a facilidade de programação assíncrona. Em 2013 a Netflix libera um projeto open source chamado RxJava, uma implementação da especificação RX para Java. Possibilitando assim o uso de RX em todos os seus módulos escritos em Java e Scala. 6
  • 8. • Java: RxJava • JavaScript: RxJS • C#: Rx.NET • C#(Unity): UniRx • Scala: RxScala • Clojure: RxClojure • C++: RxCpp 8
  • 9. • Ruby: Rx.rb • Python: RxPY • Groovy: RxGroovy • JRuby: RxJRuby • Kotlin: RxKotlin • Swift: RxSwift • PHP: RxPHP 9
  • 10. Uma sintaxe única para todas as linguagens 10
  • 11. RxJava Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> observer) { try { for (int i = 1; i < 5; i++) { observer.onNext(i); } observer.onCompleted(); } catch (Exception e) { observer.onError(e); } } } ); 11
  • 12. RxGroovy def myObservable = Observable.create({ aSubscriber -> try { for (int i = 1; i < 5; i++) { aSubscriber.onNext(i); } aSubscriber.onCompleted(); } catch(Throwable t) { aSubscriber.onError(t); } }) 12
  • 13. RxSwift let source = Observable.create { observer in do { for i in 1...5 { observer.on(.Next(i)) } observer.on(.Completed) } catch { observer.on(.Error) } } 13
  • 14. Qual a grande jogada do RxJava 14
  • 15. 15
  • 16. RX trás a união e expansão de dois padrões de projeto 16
  • 20. Adicionando a isso funções de transformação e tratamento assíncrono de dados 20
  • 21. Entre o Observable e o Subscriber podemos aplicar diversas funções de transformação 21
  • 23. Aplicando um filtro String[] search = {"google", "microsoft"}; Observable.from(search) .filter(s -> s.contains("g")) .subscribe(s -> { Log.d(TAG, s); }); 23
  • 24. 24
  • 25. Vamos adicionar o controle de threads 25
  • 26. String[] search = {"google", "microsoft"}; Observable.from(search) .filter(s -> complexAndSlowFilter(s)) .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> { Log.d(TAG, s); }); 26
  • 27. Schedulers • Schedulers.computation() - Usado para ações em CPU bound em multi thread. • Schedulers.io() - Usado para ações em IO bound. • Schedulers.newThread() - Execução em nova thread. • Schedulers.immediate() - Execução na thread atual. • Schedulers.trampoline() - Execução na thread atual, mas apenas após outras ações enfileiradas. 27
  • 29. Vamos para um exemplo pratico 29
  • 30. Em quantas linhas? • Campo de texto irá buscar em um serviço web • Buscas feitas apenas com pelo menos 3 caracteres • Buscas feitas apenas quando o usuário passar 500 milissegundos sem digitar 30
  • 31. Precisamos criar um observable do SearchView public Observable<String> getSearchObservable(SearchView searchView) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { subscriber.onNext(newText); return true; } }); } }); } 31
  • 32. E depois aplicar algumas transformações public Observable<String> getSearchObservable(SearchView searchView) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { subscriber.onNext(newText); return true; } }); } }).filter(s -> fragment != null) .map(s -> "http://search.com.br/" + s) .filter(s -> s.length() >= 3) .debounce(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.computation()); 32
  • 33. E apenas isso na sua camada de visão getSearchObservable(searchField).subscribe(s -> { doRequest(); }) 33
  • 34. Vamos ver alguns truques legais com RxJava 34
  • 35. Facil de cancelar • Sempre que chamamos o método subscribe(), o retorno do mesmo é uma Subscription. • Uma subscription pode ser facilmente cancelada. Subscription subscription = getSearchObservable(searchField).subscribe(s -> { doRequest(); }); subscription.unsubscribe(); 35
  • 37. AsyncTasks são tóxicas para o seu código. 37
  • 38. AsyncTask<String, String, User> asyncTask = new AsyncTask<String, String, User>() { @Override protected void onPreExecute() { // Show a progress dialog } @Override protected User doInBackground(String... params) { return getUserSync(params[0]); } @Override protected void onPostExecute(User s) { // Update the UI } @Override protected void onProgressUpdate(String... values) { // Notify progress } }; 38
  • 39. Método getUser public Observable<User> getUser(String name) { return Observable.create((Observable.OnSubscribe<User>) subscriber -> { try { User user = getUserSync(name); subscriber.onNext(user); subscriber.onCompleted(); } catch (IOException e) { subscriber.onError(e); } }).subscribeOn(Schedulers.io()); } 39
  • 40. Consumindo getUser private void doRequest() { getUser("José") .observeOn(AndroidSchedulers.mainThread()) .subscribe(user -> { updateUi(user); }, throwable -> { handleError(throwable); }); } 40
  • 41. Ou apenas use o Retrofit @GET("/{name}") Observable<User> getUser(@Path("name") String name); 41
  • 43. Um timer simples com RxJava Subscription subscription = Observable.timer(START_DELAY, POLL_INTERVAL, TimeUnit.SECONDS) .subscribe(aLong -> { Log.d(TAG, String.valueOf(aLong)); }); subscription.unsubscribe(); 43
  • 44. A simplicidade de fazer tarefas de forma assíncrona abre novas possibilidades 44
  • 45. Qualquer operação de IO deve ser realizada em uma thread separada. Isso inclui acesso a banco de dados e SharedPreferences 45
  • 46. O maior motivo se adotar RxJava é o suporte da comunidade 46
  • 47. Existem muitas bibliotecas com Suporte a RxJava • Retrofit: https://github.com/square/retrofit • RxBinding: https://github.com/JakeWharton/RxBinding • SqlBrite: https://github.com/square/sqlbrite • Rx-preferences: https://github.com/f2prateek/rx- preferences 47