SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
RXJAVA
REFACTORING FOR
UBIRATAN SOARES
SEPTEMBER / 2016
MOTIVAÇÕES
RxJava é um dos trending topics no desenvolvimento para Android
nos últimos 2+ anos
Você certamente já viu alguma solução “Rxfyed" para algum
problema na sua timeline.
Fato : programação reativa oferece soluções poderosas para
problemas difíceis
Fato : RxJava irá alcançar o release 2.0.0 em breve, uma
atualização significativa com novas funcionalidades e várias
mudanças
ESSA PARECE
SER UMA ÓTIMA
PERGUNTA !
Seu me projeto não utiliza nada
de RxJava hoje, como eu o
refatoro para ter acesso à
essas benesses divinas?
restAPI.endpoint()
.compose(Transformers::handleNetworkingError)
.onErrorResumeNext(t-> handleError(t))
.map(payload -> payload.array)
.flatMap(Observable::from)
.filter(DataValidation::validate)
.map(ModelTransformer::toUI)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(

data -> updateUI(data),

this::reportError,

() -> Timber.d(“DONE”)

);
🤔
😖
😍
SUA REAÇÃO ?
ANTES DE TUDO
ENTENDER
RXJAVA
DATA TRANSFORMER
VISÃO SIMPLIFICADA
OBSERVABLE OBSERVER
FUNCTIONAL
OPERATION
DATA SOURCE
FUNCTIONAL
OPERATION
DATA CONSUMER
…
UM GUIA ENVIESADO
1
2
3
4
Identifique uma fonte de emissões reativas e defina o
tipo de fluxo desses dados
Adaptar e evoluir as camadas da sua aplicação para
orquestrar o fluxo de dados, ligando fonte a consumidor
Identifique em que ponto da sua aplicação você quer
receber esses dados (Observer / Subscriber)
Se as fontes de dados mais óbvias já esgotaram, hora de
avançar para as não-óbvias. Retornar para passo 01
REACTIVE DATA
SOURCES
“Like bugs, you can find them
everywhere in your code”
- Soares, U.
ANTES (ASYNCTASK)
private void notSoTastyThreading(String input) {
new AsyncTask<String, Void, String>() {
@Override protected void onPreExecute() {
notifyProcessingBeforeInit();
}
@Override protected String doInBackground(String... params) {
return processing(params[0]);
}
@Override protected void onPostExecute(String result) {
handleResult(result);
}
}.execute(input);
}
DEPOIS (THREADING COM RXJAVA)
private void beatifulThreading(String input) {

Observable.just(input)

.doOnSubscribe(this::notifyProcessingBeforeInit)

.map(this::processing)

.subscribeOn(Schedulers.computation())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(this::handleResult);
}
ANTES (TIMERTASK)
Handler toMainThread = new Handler(Looper.getMainLooper());



TimerTask periodic = new TimerTask() {

@Override public void run() {

toMainThread.post(() -> updateUI());

}

};



Timer timer = new Timer();

timer.schedule(periodic, NO_DELAY, PERIOD_IN_MILIS);

. . .
timer.purge();
DEPOIS (TIMER COM RXJAVA)
Subscription timer =
Observable.timer(PERIOD_IN_SECONDS, TimeUnit.SECONDS)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(instant -> updateUI());

. . .
timer.unsubscribe()
ANTES (RETROFIT VIA CALL PATTERN)
api.movieWithId(movieId);

.enqueue(new Callback<Movie>() {

@Override public void onResponse(
Call<Movie> call, Response<Movie> response) {

if(response.isSuccessful()) {

// Success

} else {

// 4xx or 5xx

}

}

@Override public void onFailure(Call<Movie> call, Throwable t) {
// Deu ruim mesmo

}

});
DEPOIS (RETROFIT COM RXJAVA)
starWarsAPI.people()
.subscribeOn(Schedulers.io())
.flatMap(payload -> Observable.from(payload.results))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(

data -> addToList(data),

Throwable::printStackTrace,

() -> adapter.notifyDataSetChanged()

);
E PARA ENCADEAR
DUAS OPERAÇÕES
ASSÍNCRONAS ?
ANTES : CHAINING CALLBACKS
DEPOIS : CHAINING COM RXJAVA
starWarsApi.people()
.subscribeOn(Schedulers.io())
.flatMap(payload -> selectRandomPeople(payload.results))
.doOnNext(System.out::println)
.flatMap(people -> Observable.from(people.films))
.flatMap(filmUrl -> {
String filmId = ResourceIdExtractor.idFromUrl(filmUrl);
return api.movieById(filmId)

})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(

data -> addToMoviesList(data),

Throwable::printStackTrace,

() -> moviesAdapter.notifyDataSetChanged()

);
FLATTENING (MERGE)
MAPPING (PROVIDED FUNCTION)
FLATMAP
REACTIVE SOURCES NA INTERFACE
RxBinding to the rescue!
É possível adaptar outros callbacks utilizando Subjects ou o
utilitário fromAsync / fromEmitter
Atenção ao lidar com operadores que envolvam tempo : eles já
trocam o Scheduler da sequência, é preciso ressincronizar com
a UI Thread para atualizações na UI
SEARCHVIEW (RX WAY)
@Override public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_search_by_terms, menu);

MenuItem search = menu.findItem(R.id.search);

SearchView searchView =
(SearchView) MenuItemCompat.getActionView(search);



RxSearchView.queryTextChangeEvents(searchView)

.debounce(300, TimeUnit.MILLISECONDS)

.observeOn(AndroidSchedulers.mainThread())

.subscribe(this::proceedWithQuery);



return true;

}
DEFINING YOUR
OBSERVERS
“Ideas are bullet proof”
- V
OBSERVER (NORMAL WAY)
api.getAvaliableItems(),
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<Item>>() {
@Override public void onCompleted() { … }
@Override public void onError(Throwable e) { … }
@Override public void onNext(List<Item> items) { … }
}
);
OBSERVER (ACTIONS WAY)
Observable.fromCallable(() -> “Better subscribing with actions”)
.subscribe(
System.out::println,
throwable -> someErrorAction(),
() -> done()
);
IMPORTANTE
SEMPRE IMPLEMENTE onError( ) em seus Observers/
Subscribers, com Actions ou não
Observers / Subscribers causam memory leaks se retidos em
Activities / Fragments / etc
Controle no ciclo de vida via Subscription
Evite Subscribers (statefull)
Subscription first = Observable.interval(1, TimeUnit.SECONDS)

.subscribe(System.out::print);



Subscription second = Observable.range(1, 100000)

.subscribe(System.out::print);



CompositeSubscription subs = new CompositeSubscription();

subs.add(first);

subs.add(second);
// . . . 

first.unsubscribe();
subs.add(third);


if(subs.hasSubscriptions()) subs.unsubscribe();
EVOLVING YOUR
ARCHITECTURE
“Tradeoffs? Wellcome to Engineering”
- Uncle Bob Martin
UMA APLICAÇÃO DOS DIAS ANTIGOS
REST API MANAGER
ACTIVITY FRAGMENT
Callback
EventBus
UMA APLICAÇÃO DOS DIAS MODERNOS
PRESENTER
ACTIVITY FRAGMENT VIEW
MODELS / EXTERNAL WORLD ADAPTERS
PRESENTER
VIEW (IMPL)
MODEL
MANAGER
ACTIVITY /
FRAGMENT
As direções de fluxo de dados
indicam como você pode substituir
callbacks / eventos por uma
sequência observável!
PRESENTER
VIEW (IMPL)
MODEL
MANAGER
ACTIVITY /
FRAGMENT
Caso 01 : as emissões serão
geradas nas camadas mais internas
da aplicação e consumidas nas
camadas mais próximas à UI
(Presenter ou Android)
PRESENTER
VIEW (IMPL)
MODEL
MANAGER
ACTIVITY /
FRAGMENT
Caso 02 : as emissões são
originadas da UI e consumidas nas
camadas internas mais da
aplicação
REACTIVE MVP
PRESENTER
ACTIVITY / FRAGMENT / VIEW
RX SOURCE
Observable<SomeModel>
Observable<SomeModel>
Observable<SomeModel>
Observable<SomeModel>
REACTIVE CLEAN ARCHITECTURE
PRESENTERRX SOURCE
Observable<InputModel>
Observable<ViewModel>
Observable<DomainModel>
REST API
PREFS
DB
ACTIVITY
FRAGMENT
ETC
PLATFORM
USECASE
Observable<DomainModel>
CONSIDERAÇÕES PRÁTICAS
Consumir emissões no Presenter vs View Passiva ?
Consumir emissões no Android vs View Reativa ?
Consumo de emissões na UI vs Repository passivo(s) ?
Emissão na UI e consumo no Repository reativo?
Como lidar com estado no Presenter?
Como driblar boilerplating da replicação de dados?
Como testar tudo isso?
NON-OBVIOUS
REACTIVE SOURCES
“Let`s catch them all”
Ash
ONDE PROCURAR?
Qualquer callback de uso recorrente pode ser encapsulado para
emitir eventos em uma sequência observável
Android Framework está cheio deles!
APIs de suporte estão cheias deles!
PlayServices e adendos estão cheios deles!
ETC
class GoogleApiClientObservable extends BaseClient implements Action1<AsyncEmitter<GoogleApiClient>> {
private final Api api;
private AsyncEmitter<GoogleApiClient> emitter;
private GoogleApiClientObservable(Context context, Api api) {
super(context);
this.api = api;
}
static Observable<GoogleApiClient> create(Context context, Api api) {
return Observable.fromAsync(new GoogleApiClientObservable(context, api), BackpressureMode.NONE);
}
@Override public void call(AsyncEmitter<GoogleApiClient> emitter) {
this.emitter = emitter;
buildClient(api);
connect();
emitter.setSubscription(Subscriptions.create(this::disconnect));
}
@Override void onClientConnected(GoogleApiClient googleApiClient) {
emitter.onNext(googleApiClient);
}
@Override void onClientError(Throwable throwable) {
emitter.onError(throwable);
}
}
Snippet from Servant
https://github.com/Mauin/servant
QUANDO NÃO
USAR RXJAVA ?
“U HAVE NOTHING, NOTHING !!!!”
- Al Capone, The Untouchables
ALGUM CASOS A CONSIDERAR
Valores que não mudam nunca : justificam ser passados por
Callback observável?
Observer/Subscriber desencadeia uma operação pesada no
emissor, e a sequência por sua vez é multicasted
Você precisa de snapshots de estados intermediários referentes
às emissões por algum motivo
Seu design de classes sugere que um Observable<T> até podia
ser uma variável membro …
ETC
FINAL
REMARKS
"You know nothing, Jon Snow"
- Game of Thrones
DONT FORGET KIDS
Comece pelos casos simples
Evolua para os casos complexos
Defina quais camadas da sua aplicação são reativas ou não
Substitua callbacks/eventos por sequência observáveis
FTW
REFERÊNCIAS (I)
"Functional Reactive Programming with RxJava" by Ben Christensen
https://youtu.be/_t06LRX0DV0
“Learning RxJava (for Android) by example“ by Kaushik Goupal
https://youtu.be/k3D0cWyNno4
“Demystifying RxJava Subscribers" by Jake Wharton
https://youtu.be/NVKmyK6sd-Q
“What does it mean to be Reactive ?” by Erik Meijer
https://youtu.be/sTSQlYX5DU0
REFERÊNCIAS (II)
"Grokking RxJava Series” by Dan Lew
http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
“The Introduction to Reactive Programming you`ve been missing” by André Staltz
https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
Oficial RxJava Wiki by NetFlix
https://github.com/ReactiveX/RxJava/wiki
Advanced RxJava Blog by David Karnok
akarnokd.blogspot.com
REFERÊNCIAS (III)
GradleLambda : https://github.com/evant/gradle-retrolambda
RxAndroid : https://github.com/ReactiveX/RxAndroid
RxLifecycle : https://github.com/trello/RxLifecycle
RxBinding : https://github.com/JakeWharton/RxBinding
Frodo : https://github.com/android10/frodo
speakerdeck.com/ubiratansoares/refactoring-to-rxjava
UBIRATAN
SOARES
Computer Scientist by ICMC/USP
Software Engineer @ Luiza Labs
Google Developer Expert for Android
Teacher, speaker, etc, etc
THANKS!
THAT`S ALL FOLKS !!!
@ubiratanfsoares
br.linkedin.com/in/ubiratanfsoares
ubiratansoares.github.io

Mais conteúdo relacionado

Mais procurados

Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnitLeonardo Soares
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger daggertdc-globalcode
 
Teste unitário
Teste unitárioTeste unitário
Teste unitáriodist_bp
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDDDextra
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSFábio Miranda
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junitcejug
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelManoel Pimentel Medeiros
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislAdriano Petrich
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Djangofabiocerqueira
 

Mais procurados (18)

Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnit
 
Junit
JunitJunit
Junit
 
Power mock
Power mockPower mock
Power mock
 
JUnit
JUnitJUnit
JUnit
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Java 12
Java 12Java 12
Java 12
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
Android: testes automatizados e TDD
Android: testes automatizados e TDDAndroid: testes automatizados e TDD
Android: testes automatizados e TDD
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
TDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOSTDD - Algumas lições aprendidas com o livro GOOS
TDD - Algumas lições aprendidas com o livro GOOS
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Testes com JUnit
Testes com JUnitTestes com JUnit
Testes com JUnit
 
Implementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel PimentelImplementando Testes Unitários em Java - Manoel Pimentel
Implementando Testes Unitários em Java - Manoel Pimentel
 
TDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fislTDD em django sem desculpas versao fisl
TDD em django sem desculpas versao fisl
 
TDD com Python
TDD com PythonTDD com Python
TDD com Python
 
Testes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e DjangoTestes, deploy e integração continua com Python e Django
Testes, deploy e integração continua com Python e Django
 
Introdução a tdd
Introdução a tddIntrodução a tdd
Introdução a tdd
 

Destaque

Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no AndroidNelson Glauber Leal
 
Android DevConference - SOLID no Android
Android DevConference - SOLID no AndroidAndroid DevConference - SOLID no Android
Android DevConference - SOLID no AndroidiMasters
 
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...iMasters
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidiMasters
 
Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureiMasters
 
A Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on AndroidA Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on AndroidOutware Mobile
 
Android Clean Architecture for Dummies
Android Clean Architecture for DummiesAndroid Clean Architecture for Dummies
Android Clean Architecture for DummiesKengo Suzuki
 

Destaque (7)

Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 
Android DevConference - SOLID no Android
Android DevConference - SOLID no AndroidAndroid DevConference - SOLID no Android
Android DevConference - SOLID no Android
 
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
Android DevConference - Live code with Kotlin: construindo o primeiro app usa...
 
Android DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps AndroidAndroid DevConference - Indo além com automação de testes de apps Android
Android DevConference - Indo além com automação de testes de apps Android
 
Android DevConference - Android Clean Architecture
Android DevConference - Android Clean ArchitectureAndroid DevConference - Android Clean Architecture
Android DevConference - Android Clean Architecture
 
A Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on AndroidA Separation of Concerns: Clean Architecture on Android
A Separation of Concerns: Clean Architecture on Android
 
Android Clean Architecture for Dummies
Android Clean Architecture for DummiesAndroid Clean Architecture for Dummies
Android Clean Architecture for Dummies
 

Semelhante a Android DevConference - Refactoring for RxJava

TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Androidtdc-globalcode
 
Programação reativa com RxJava
Programação reativa com RxJavaProgramação reativa com RxJava
Programação reativa com RxJavaMateus Parente
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumArquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumCaelum
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Carlos Duarte do Nascimento
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineCampus Party Brasil
 
Curso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos ChavesCurso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos ChavesRonildo Oliveira
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidAdriano Rocha
 
Treze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidTreze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidRicardo Longa
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.Clerton Leal
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionaliMasters
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Androidjoaobmonteiro
 
Construindo sua primeira aplicação android
Construindo sua primeira aplicação androidConstruindo sua primeira aplicação android
Construindo sua primeira aplicação android666Insanity
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsDiego Castro
 

Semelhante a Android DevConference - Refactoring for RxJava (20)

TDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no AndroidTDC2016POA | Trilha Android - Testes no Android
TDC2016POA | Trilha Android - Testes no Android
 
Programação reativa com RxJava
Programação reativa com RxJavaProgramação reativa com RxJava
Programação reativa com RxJava
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumArquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Curso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos ChavesCurso Android - 03 Conceitos Chaves
Curso Android - 03 Conceitos Chaves
 
Android Wear
Android WearAndroid Wear
Android Wear
 
Treze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento AndroidTreze ferramentas/frameworks para desenvolvimento Android
Treze ferramentas/frameworks para desenvolvimento Android
 
Treze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento androidTreze ferramentas/frameworks para desenvolvimento android
Treze ferramentas/frameworks para desenvolvimento android
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.RxJava - Programação assíncrona para Android.
RxJava - Programação assíncrona para Android.
 
JS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript FuncionalJS Experience 2017 - Javascript Funcional
JS Experience 2017 - Javascript Funcional
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 
Introdução ao struts 2
Introdução ao struts 2Introdução ao struts 2
Introdução ao struts 2
 
Construindo sua primeira aplicação android
Construindo sua primeira aplicação androidConstruindo sua primeira aplicação android
Construindo sua primeira aplicação android
 
API Apontador
API ApontadorAPI Apontador
API Apontador
 
Vraptor
VraptorVraptor
Vraptor
 
Tornado
TornadoTornado
Tornado
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 

Mais de iMasters

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroiMasters
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesiMasters
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesiMasters
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...iMasters
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesiMasters
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...iMasters
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsiMasters
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...iMasters
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudiMasters
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza LeiteiMasters
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesiMasters
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosiMasters
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle MonteiroiMasters
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujoriMasters
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaiMasters
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiiMasters
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...iMasters
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisiMasters
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoiMasters
 

Mais de iMasters (20)

O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani MonteiroO que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
O que você precisa saber para modelar bancos de dados NoSQL - Dani Monteiro
 
Postgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio TellesPostgres: wanted, beloved or dreaded? - Fabio Telles
Postgres: wanted, beloved or dreaded? - Fabio Telles
 
Por que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen MoraesPor que minha query esta lenta? - Suellen Moraes
Por que minha query esta lenta? - Suellen Moraes
 
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
Relato das trincheiras: o dia a dia de uma consultoria de banco de dados - Ig...
 
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalvesORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
ORMs heróis ou vilões dentro da arquitetura de dados? - Otávio gonçalves
 
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
SQL e NoSQL trabalhando juntos: uma comparação para obter o melhor de ambos -...
 
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra MartinsArquitetando seus dados na prática para a LGPD - Alessandra Martins
Arquitetando seus dados na prática para a LGPD - Alessandra Martins
 
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
O papel do DBA no mundo de ciência de dados e machine learning - Mauro Pichil...
 
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana ChahoudDesenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
Desenvolvimento Mobile Híbrido, Nativo ou Web: Quando usá-los - Juliana Chahoud
 
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 Use MDD e faça as máquinas trabalharem para você - Andreza Leite Use MDD e faça as máquinas trabalharem para você - Andreza Leite
Use MDD e faça as máquinas trabalharem para você - Andreza Leite
 
Entendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita BernardesEntendendo os porquês do seu servidor - Talita Bernardes
Entendendo os porquês do seu servidor - Talita Bernardes
 
Backend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana ArnosBackend performático além do "coloca mais máquina lá" - Diana Arnos
Backend performático além do "coloca mais máquina lá" - Diana Arnos
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
7 dicas de desempenho que equivalem por 21 - Danielle Monteiro
 
Quem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio MaujorQuem se importa com acessibilidade Web? - Mauricio Maujor
Quem se importa com acessibilidade Web? - Mauricio Maujor
 
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da SilvaService Mesh com Istio e Kubernetes - Wellington Figueira da Silva
Service Mesh com Istio e Kubernetes - Wellington Figueira da Silva
 
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto PascuttiErros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
Erros: Como eles vivem, se alimentam e se reproduzem? - Augusto Pascutti
 
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...Elasticidade e engenharia de banco de dados para alta performance  - Rubens G...
Elasticidade e engenharia de banco de dados para alta performance - Rubens G...
 
Construindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina KarklisConstruindo aplicações mais confiantes - Carolina Karklis
Construindo aplicações mais confiantes - Carolina Karklis
 
Monitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe RegalgoMonitoramento de Aplicações - Felipe Regalgo
Monitoramento de Aplicações - Felipe Regalgo
 

Último

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuisKitota
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfSamaraLunas
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 

Último (8)

Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 

Android DevConference - Refactoring for RxJava

  • 2. MOTIVAÇÕES RxJava é um dos trending topics no desenvolvimento para Android nos últimos 2+ anos Você certamente já viu alguma solução “Rxfyed" para algum problema na sua timeline. Fato : programação reativa oferece soluções poderosas para problemas difíceis Fato : RxJava irá alcançar o release 2.0.0 em breve, uma atualização significativa com novas funcionalidades e várias mudanças
  • 3. ESSA PARECE SER UMA ÓTIMA PERGUNTA ! Seu me projeto não utiliza nada de RxJava hoje, como eu o refatoro para ter acesso à essas benesses divinas?
  • 4. restAPI.endpoint() .compose(Transformers::handleNetworkingError) .onErrorResumeNext(t-> handleError(t)) .map(payload -> payload.array) .flatMap(Observable::from) .filter(DataValidation::validate) .map(ModelTransformer::toUI) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(
 data -> updateUI(data),
 this::reportError,
 () -> Timber.d(“DONE”)
 ); 🤔 😖 😍 SUA REAÇÃO ?
  • 6. DATA TRANSFORMER VISÃO SIMPLIFICADA OBSERVABLE OBSERVER FUNCTIONAL OPERATION DATA SOURCE FUNCTIONAL OPERATION DATA CONSUMER …
  • 7. UM GUIA ENVIESADO 1 2 3 4 Identifique uma fonte de emissões reativas e defina o tipo de fluxo desses dados Adaptar e evoluir as camadas da sua aplicação para orquestrar o fluxo de dados, ligando fonte a consumidor Identifique em que ponto da sua aplicação você quer receber esses dados (Observer / Subscriber) Se as fontes de dados mais óbvias já esgotaram, hora de avançar para as não-óbvias. Retornar para passo 01
  • 8. REACTIVE DATA SOURCES “Like bugs, you can find them everywhere in your code” - Soares, U.
  • 9. ANTES (ASYNCTASK) private void notSoTastyThreading(String input) { new AsyncTask<String, Void, String>() { @Override protected void onPreExecute() { notifyProcessingBeforeInit(); } @Override protected String doInBackground(String... params) { return processing(params[0]); } @Override protected void onPostExecute(String result) { handleResult(result); } }.execute(input); }
  • 10. DEPOIS (THREADING COM RXJAVA) private void beatifulThreading(String input) {
 Observable.just(input)
 .doOnSubscribe(this::notifyProcessingBeforeInit)
 .map(this::processing)
 .subscribeOn(Schedulers.computation())
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(this::handleResult); }
  • 11. ANTES (TIMERTASK) Handler toMainThread = new Handler(Looper.getMainLooper());
 
 TimerTask periodic = new TimerTask() {
 @Override public void run() {
 toMainThread.post(() -> updateUI());
 }
 };
 
 Timer timer = new Timer();
 timer.schedule(periodic, NO_DELAY, PERIOD_IN_MILIS);
 . . . timer.purge();
  • 12. DEPOIS (TIMER COM RXJAVA) Subscription timer = Observable.timer(PERIOD_IN_SECONDS, TimeUnit.SECONDS)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(instant -> updateUI());
 . . . timer.unsubscribe()
  • 13. ANTES (RETROFIT VIA CALL PATTERN) api.movieWithId(movieId);
 .enqueue(new Callback<Movie>() {
 @Override public void onResponse( Call<Movie> call, Response<Movie> response) {
 if(response.isSuccessful()) {
 // Success
 } else {
 // 4xx or 5xx
 }
 }
 @Override public void onFailure(Call<Movie> call, Throwable t) { // Deu ruim mesmo
 }
 });
  • 14. DEPOIS (RETROFIT COM RXJAVA) starWarsAPI.people() .subscribeOn(Schedulers.io()) .flatMap(payload -> Observable.from(payload.results)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(
 data -> addToList(data),
 Throwable::printStackTrace,
 () -> adapter.notifyDataSetChanged()
 );
  • 15. E PARA ENCADEAR DUAS OPERAÇÕES ASSÍNCRONAS ?
  • 16. ANTES : CHAINING CALLBACKS
  • 17. DEPOIS : CHAINING COM RXJAVA starWarsApi.people() .subscribeOn(Schedulers.io()) .flatMap(payload -> selectRandomPeople(payload.results)) .doOnNext(System.out::println) .flatMap(people -> Observable.from(people.films)) .flatMap(filmUrl -> { String filmId = ResourceIdExtractor.idFromUrl(filmUrl); return api.movieById(filmId)
 }) .observeOn(AndroidSchedulers.mainThread()) .subscribe(
 data -> addToMoviesList(data),
 Throwable::printStackTrace,
 () -> moviesAdapter.notifyDataSetChanged()
 );
  • 19. REACTIVE SOURCES NA INTERFACE RxBinding to the rescue! É possível adaptar outros callbacks utilizando Subjects ou o utilitário fromAsync / fromEmitter Atenção ao lidar com operadores que envolvam tempo : eles já trocam o Scheduler da sequência, é preciso ressincronizar com a UI Thread para atualizações na UI
  • 20. SEARCHVIEW (RX WAY) @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search_by_terms, menu);
 MenuItem search = menu.findItem(R.id.search);
 SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
 
 RxSearchView.queryTextChangeEvents(searchView)
 .debounce(300, TimeUnit.MILLISECONDS)
 .observeOn(AndroidSchedulers.mainThread())
 .subscribe(this::proceedWithQuery);
 
 return true;
 }
  • 22. OBSERVER (NORMAL WAY) api.getAvaliableItems(), .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<List<Item>>() { @Override public void onCompleted() { … } @Override public void onError(Throwable e) { … } @Override public void onNext(List<Item> items) { … } } );
  • 23. OBSERVER (ACTIONS WAY) Observable.fromCallable(() -> “Better subscribing with actions”) .subscribe( System.out::println, throwable -> someErrorAction(), () -> done() );
  • 24. IMPORTANTE SEMPRE IMPLEMENTE onError( ) em seus Observers/ Subscribers, com Actions ou não Observers / Subscribers causam memory leaks se retidos em Activities / Fragments / etc Controle no ciclo de vida via Subscription Evite Subscribers (statefull)
  • 25. Subscription first = Observable.interval(1, TimeUnit.SECONDS)
 .subscribe(System.out::print);
 
 Subscription second = Observable.range(1, 100000)
 .subscribe(System.out::print);
 
 CompositeSubscription subs = new CompositeSubscription();
 subs.add(first);
 subs.add(second); // . . . 
 first.unsubscribe(); subs.add(third); 
 if(subs.hasSubscriptions()) subs.unsubscribe();
  • 26. EVOLVING YOUR ARCHITECTURE “Tradeoffs? Wellcome to Engineering” - Uncle Bob Martin
  • 27. UMA APLICAÇÃO DOS DIAS ANTIGOS REST API MANAGER ACTIVITY FRAGMENT Callback EventBus
  • 28. UMA APLICAÇÃO DOS DIAS MODERNOS PRESENTER ACTIVITY FRAGMENT VIEW MODELS / EXTERNAL WORLD ADAPTERS
  • 29. PRESENTER VIEW (IMPL) MODEL MANAGER ACTIVITY / FRAGMENT As direções de fluxo de dados indicam como você pode substituir callbacks / eventos por uma sequência observável!
  • 30. PRESENTER VIEW (IMPL) MODEL MANAGER ACTIVITY / FRAGMENT Caso 01 : as emissões serão geradas nas camadas mais internas da aplicação e consumidas nas camadas mais próximas à UI (Presenter ou Android)
  • 31. PRESENTER VIEW (IMPL) MODEL MANAGER ACTIVITY / FRAGMENT Caso 02 : as emissões são originadas da UI e consumidas nas camadas internas mais da aplicação
  • 32. REACTIVE MVP PRESENTER ACTIVITY / FRAGMENT / VIEW RX SOURCE Observable<SomeModel> Observable<SomeModel> Observable<SomeModel> Observable<SomeModel>
  • 33. REACTIVE CLEAN ARCHITECTURE PRESENTERRX SOURCE Observable<InputModel> Observable<ViewModel> Observable<DomainModel> REST API PREFS DB ACTIVITY FRAGMENT ETC PLATFORM USECASE Observable<DomainModel>
  • 34. CONSIDERAÇÕES PRÁTICAS Consumir emissões no Presenter vs View Passiva ? Consumir emissões no Android vs View Reativa ? Consumo de emissões na UI vs Repository passivo(s) ? Emissão na UI e consumo no Repository reativo? Como lidar com estado no Presenter? Como driblar boilerplating da replicação de dados? Como testar tudo isso?
  • 36. ONDE PROCURAR? Qualquer callback de uso recorrente pode ser encapsulado para emitir eventos em uma sequência observável Android Framework está cheio deles! APIs de suporte estão cheias deles! PlayServices e adendos estão cheios deles! ETC
  • 37. class GoogleApiClientObservable extends BaseClient implements Action1<AsyncEmitter<GoogleApiClient>> { private final Api api; private AsyncEmitter<GoogleApiClient> emitter; private GoogleApiClientObservable(Context context, Api api) { super(context); this.api = api; } static Observable<GoogleApiClient> create(Context context, Api api) { return Observable.fromAsync(new GoogleApiClientObservable(context, api), BackpressureMode.NONE); } @Override public void call(AsyncEmitter<GoogleApiClient> emitter) { this.emitter = emitter; buildClient(api); connect(); emitter.setSubscription(Subscriptions.create(this::disconnect)); } @Override void onClientConnected(GoogleApiClient googleApiClient) { emitter.onNext(googleApiClient); } @Override void onClientError(Throwable throwable) { emitter.onError(throwable); } } Snippet from Servant https://github.com/Mauin/servant
  • 38. QUANDO NÃO USAR RXJAVA ? “U HAVE NOTHING, NOTHING !!!!” - Al Capone, The Untouchables
  • 39. ALGUM CASOS A CONSIDERAR Valores que não mudam nunca : justificam ser passados por Callback observável? Observer/Subscriber desencadeia uma operação pesada no emissor, e a sequência por sua vez é multicasted Você precisa de snapshots de estados intermediários referentes às emissões por algum motivo Seu design de classes sugere que um Observable<T> até podia ser uma variável membro … ETC
  • 40. FINAL REMARKS "You know nothing, Jon Snow" - Game of Thrones
  • 41. DONT FORGET KIDS Comece pelos casos simples Evolua para os casos complexos Defina quais camadas da sua aplicação são reativas ou não Substitua callbacks/eventos por sequência observáveis FTW
  • 42. REFERÊNCIAS (I) "Functional Reactive Programming with RxJava" by Ben Christensen https://youtu.be/_t06LRX0DV0 “Learning RxJava (for Android) by example“ by Kaushik Goupal https://youtu.be/k3D0cWyNno4 “Demystifying RxJava Subscribers" by Jake Wharton https://youtu.be/NVKmyK6sd-Q “What does it mean to be Reactive ?” by Erik Meijer https://youtu.be/sTSQlYX5DU0
  • 43. REFERÊNCIAS (II) "Grokking RxJava Series” by Dan Lew http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ “The Introduction to Reactive Programming you`ve been missing” by André Staltz https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 Oficial RxJava Wiki by NetFlix https://github.com/ReactiveX/RxJava/wiki Advanced RxJava Blog by David Karnok akarnokd.blogspot.com
  • 44. REFERÊNCIAS (III) GradleLambda : https://github.com/evant/gradle-retrolambda RxAndroid : https://github.com/ReactiveX/RxAndroid RxLifecycle : https://github.com/trello/RxLifecycle RxBinding : https://github.com/JakeWharton/RxBinding Frodo : https://github.com/android10/frodo
  • 46. UBIRATAN SOARES Computer Scientist by ICMC/USP Software Engineer @ Luiza Labs Google Developer Expert for Android Teacher, speaker, etc, etc
  • 47. THANKS! THAT`S ALL FOLKS !!! @ubiratanfsoares br.linkedin.com/in/ubiratanfsoares ubiratansoares.github.io