$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ReactiveX - escolha sua plataforma
Search
Ruiter Matos
December 08, 2017
Technology
1
39
ReactiveX - escolha sua plataforma
Apresentação sobre duas libs de RX: RxJava e RxJS
Ruiter Matos
December 08, 2017
Tweet
Share
More Decks by Ruiter Matos
See All by Ruiter Matos
Multi Módulos em projetos Android
ruiter
1
23
Android: Passado, presente e futuro.
ruiter
1
39
Other Decks in Technology
See All in Technology
Databricks向けJupyter Kernelでデータサイエンティストの開発環境をAI-Readyにする / Data+AI World Tour Tokyo After Party
genda
1
100
SSO方式とJumpアカウント方式の比較と設計方針
yuobayashi
7
600
ログ管理の新たな可能性?CloudWatchの新機能をご紹介
ikumi_ono
1
660
AWS re:Invent 2025で見たGrafana最新機能の紹介
hamadakoji
0
340
日本Rubyの会の構造と実行とあと何か / hokurikurk01
takahashim
4
1k
GitHub Copilotを使いこなす 実例に学ぶAIコーディング活用術
74th
3
2.8k
AWS Security Agentの紹介/introducing-aws-security-agent
tomoki10
0
180
形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kernel VM Study Hokuriku Part 8
ytaka23
2
460
Haskell を武器にして挑む競技プログラミング ─ 操作的思考から意味モデル思考へ
naoya
6
1.5k
Kubernetes Multi-tenancy: Principles and Practices for Large Scale Internal Platforms
hhiroshell
0
120
MLflowで始めるプロンプト管理、評価、最適化
databricksjapan
1
150
今からでも間に合う!速習Devin入門とその活用方法
ismk
1
670
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.7k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
We Have a Design System, Now What?
morganepeng
54
7.9k
Making Projects Easy
brettharned
120
6.5k
Faster Mobile Websites
deanohume
310
31k
GraphQLとの向き合い方2022年版
quramy
50
14k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Embracing the Ebb and Flow
colly
88
4.9k
Speed Design
sergeychernyshev
33
1.4k
How to Ace a Technical Interview
jacobian
280
24k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Transcript
ReactiveX Escolha sua plataforma
None
Porque usar Rx?
5 motivos 1. Intuitivo 2. Expansível 3. Código limpo 4.
Concorrencia 5. Resolução de problemas
None
Analogia
Observable val waterObservable = Observable.just("rain water", "river water", "lake water")
Operator val cleanWater = waterObservable.map { water -> "Clean $water"
}
Subscriber cleanWater.subscribe{ cleanWater -> Log.i("TAG", "Drink $cleanWater") }
Esqueça (for, while, if else… bla,bla) val waterSource = arrayListOf("rain
water", "river water", "lake water") for (water in waterSource) { Log.i("TAG", "Drink clean $cleanWater") }
Com Rx Observable.fromIterable(waterSource) .withIndex() .filter { it.value != "" }
.subscribe({ Log.i("checkin", "value: " + it) })
Exemplo de refatoração
Código Android editText.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable)
{} override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { if (s.length != 0) editText.setText("") } })
RxJava/RxBinding editText.textChanges().subscribe({ if (it.length != 0) editText.setText("") })
Principais Operadores
• Map • Zip • Filter • FlatMap • Take
• Skip • Buffer • Concat • Replay • Merge
RxJava 2.0
Disposable/CompositeDisposable Representa um recurso descartável. Com composite podemos utilizar o
mesmo objeto para vários recursos.
Exemplo val disposable = Single .getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ Log.i("",
"success") }, { Log.i("", "error") }) disposable.dispose() var copositeDisposable = CompositeDisposable() copositeDisposable.add(Single .getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ Log.i("", "success") }, { Log.i("", "error") })) copositeDisposable.clear()
Flowable Trata problemas com grandes quantidades de dados.
Exemplo Flowable.create<Any>({ subscriber -> var count = 0 while (true)
{ count++ subscriber.onNext(count.toString() + "\n") } }, BackpressureStrategy.DROP) .observeOn(Schedulers.newThread(), false, 3) .subscribe( { `val` -> Thread.sleep(1000) println(`val`) }, { err -> println("error ") err.printStackTrace() } ) { println("completed") }
Single Um tipo de observável que trabalha apenas com onSuccess
e onError.
Exemplo Single .getUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ Log.i("", "success") }, {
Log.i("", "error") })
Completable O completable não precisa implementar um tipo de objeto
para observar.
Exemplo interface APIClient { @PUT("my/api/updatepath") fun updateMyData(@Body data: MyData): Completable
} apiClient.updateMyData(myUpdatedData) .subscribe({ // handle completion }, { throwable -> // handle error })
Maybe Semelhante ao Single e Completable, a diferença é que
seu consumidor vai receber apenas 0 ou 1.
Exemplo Maybe.just(1) .map { v -> v + 1 }
.filter { v -> v == 1 } .defaultIfEmpty(2) .test() .assertResult(2)
RxJS
Introdução O RxJS é uma biblioteca que nos permite criar
e manipular facilmente fluxos de eventos e dados.
Exemplos
Event listeners var button = document.querySelector('button'); button.addEventListener('click', () => console.log('Clicked!'));
Event listeners var button = document.querySelector('button'); Rx.Observable.fromEvent(button, 'click').subscribe(() => console.log('Clicked!'));
Flow var count = 0; var rate = 1000; var
lastClick = Date.now() - rate; var button = document.querySelector('button'); button.addEventListener('click', () => { if (Date.now() - lastClick >= rate) { console.log(`Clicked ${++count} times`); lastClick = Date.now(); }});
Em RxJS var button = document.querySelector('button'); Rx.Observable.fromEvent(button, 'click') .throttleTime(1000) .scan(count
=> count + 1, 0) .subscribe(count => console.log(`Clicked ${count} times`));
Gostou?
Vamos usar um Observable
Vamos imaginar o consumo de um web service bem comum.
Codigo em Angular getUsers(): Promise<User[]>{ return fetch(myApiUrl) .then(res=>res.json()) .catch(err=>{ throw
new Error(err.message); }); }
Com Rx @Injectable() class UserService { ... getUsers(): Observable<User[]> {
return this.http.get(myApiUrl) .map(res=>res.json()) .catch(err=>{ throw new Error(err.message); }); } … }
Ok, mas qual a vantagem?
Operadores
Subscribe getUsers() { this.userService.getUsers() .subscribe( users => this.users = users,
error => /* Tratamos erros aqui */);
Criando Observables var observable = Rx.Observable.create(function subscribe(observer) { var id
= setInterval(() => { observer.next('hi') }, 1000); });
Inscrevendo-se para Observables observable.subscribe(x => console.log(x));
Executando Observables var observable = Rx.Observable.create(function subscribe(observer) { try {
observer.next(1); observer.next(2); observer.next(3); observer.complete(); } catch (err) { observer.error(err); // delivers an error if it caught one } });
Cancelando assinatura var observable = Rx.Observable.from([10, 20, 30]); var subscription
= observable.subscribe(x => console.log(x)); subscription.unsubscribe();
Mais exemplos function multiplyByTen(input) { var output = Rx.Observable.create(function subscribe(observer)
{ input.subscribe({ next: (v) => observer.next(10 * v), error: (err) => observer.error(err), complete: () => observer.complete() }); }); return output; } var input = Rx.Observable.from([1, 2, 3, 4]); var output = multiplyByTen(input); output.subscribe(x => console.log(x));
Map var clicks = Rx.Observable.fromEvent(document, 'click'); var positions = clicks.map(ev
=> ev.clientX); positions.subscribe(x => console.log(x));
Agora é só estudar e aplicar
Referencias • http://reactivex.io/ • https://github.com/balamaci/rxjava-walkthrough • http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-map • https://medium.com/tableless/entendendo-rxjs-observable-com-angular-6f607a9a6a00
Obrigado! @ruitermatos55