Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Reactive way on Android
Search
WeRockStar
August 30, 2019
Programming
36
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Reactive way on Android
Presentation at ReactiveX meetup first in Bangkok, Thailand
WeRockStar
August 30, 2019
More Decks by WeRockStar
See All by WeRockStar
Software Design & Architecture on my mind
werockstar
0
180
Kotlin in 2 Days
werockstar
0
41
Kotlin Testing for Android
werockstar
1
76
Modern Android Development
werockstar
0
120
Disrupt Innovation
werockstar
0
52
Kotlin 101#1
werockstar
0
110
Android Reactive Programming
werockstar
0
150
Mobile Automate Testing
werockstar
0
70
Other Decks in Programming
See All in Programming
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
270
Event is what happens
moro
2
770
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
290
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
200
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
110
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
phperだってパンチカードでコーディングしたい
o0h
PRO
0
330
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
380
Kotlinの15年とServer-Side Kotlin
n_takehata
1
150
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
220
Featured
See All Featured
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
460
Large-scale JavaScript Application Architecture
addyosmani
516
110k
Everyday Curiosity
cassininazir
0
350
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
570
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
The untapped power of vector embeddings
frankvandijk
2
1.9k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
4
4.4k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
630
Transcript
@werockstar @werockstar Kotchaphan Muangsan Software Developer @ODDS
@werockstar Interested - Fundamental - OOP, FP, RP - Design
Pattern, Refactoring - Software Design
medium.com/@werockstar
None
None
Reactively way on Android @werockstar
@werockstar The Land of Reactive
@werockstar
@werockstar Before we start I gonna sharing some story about
Rx on Mobile Development
@werockstar We know the first implementation of Rx is Rx.NET
@werockstar And which is the first mobile OS uses Rx?
@werockstar And Android RxJava RxKotlin RxBinding Agera iOS RxSwift ReactiveCocoa
ReactiveSwift
Solve the same problem with Rx
@werockstar Zero to One Basic Rx on UI
@werockstar 'io.reactivex.rxjava2:rxjava:2.2.11' 'io.reactivex.rxjava2:rxkotlin:2.4.0' 'com.jakewharton.rxbinding3:rxbinding-core:3.0.0'
@werockstar click click click click
@werockstar click click click click click Time
@werockstar button.clicks() .subscribe() click click click click Button as an
producer(observable) Emitter of event() value over time Time
@werockstar button.clicks() .subscribe( { data -> println(data) }, { error
-> } ) Observer or subscriber Observer doesn't know anything about the data come from and when, or how many times
@werockstar button.clicks() .subscribe( { data -> println(data) }, { error
-> } ) Why <- Producer (Observable) <- Observer
@werockstar .subscribe( { data -> println(data) }, { error ->
} ) button.clicks() Why Decoupling the relationship Know little about each other
@werockstar click click click click Duplicate pages?
@werockstar button.clicks() .debounce(150, MILLISECONDS) .subscribe()
@werockstar click click click debounce(150, MILLISECONDS) 150 ms 150 ms
150 ms ✅
@werockstar Auto search editText.afterTextChangeEvents() .debounce(150, MILLISECONDS) .subscribe()
@werockstar editText.afterTextChangeEvents() .debounce(150, MILLISECONDS) .subscribe() A A B “A” and
“A” are duplicates?
@werockstar editText.afterTextChangeEvents() .debounce(150, MILLISECONDS) .distinctUntilChanged() ✅ .subscribe() A A B
“A” and “A” are duplicates?
@werockstar Sample Window Buffer Throttle
@werockstar ————
@werockstar
@werockstar A A B API?
@werockstar editText.afterTextChangeEvents() .debounce(200, MILLISECONDS) .distinctUntilChanged() .flatMap { api.getResult(it) } .subscribe()
A A B
@werockstar A A B API
@werockstar
@werockstar editText.afterTextChangeEvents() .debounce(200, MILLISECONDS) .distinctUntilChanged() .map { it.editable.toString() } .switchMap
{ api.getResult(it) } .subscribe() A A B
@werockstar Retry Patterns
@werockstar editText.afterTextChangeEvents() .debounce(200, MILLISECONDS) .distinctUntilChanged() .map { it.editable.toString() } .switchMap
{ api.getResult(it) } .subscribe() A A B ก้าวแรกไม่เป็นไร ก้าวต่อไปไฟเริ่มไหม้ getResult
@werockstar editText.afterTextChangeEvents() .debounce(200, TimeUnit.MILLISECONDS) .distinctUntilChanged() .map { it.editable.toString() } .switchMap
{ api.getResult(it) .retry(2) } .subscribe() A A B ✅
@werockstar But We shouldn't use retry in every situation
@werockstar editText.afterTextChangeEvents() .debounce(200, TimeUnit.MILLISECONDS) .distinctUntilChanged() .map { it.editable.toString() } .switchMap
{ api.getResult(it) .retry { attempt, throwable -> throwable is TimeoutException && attempt <= 2 } }.subscribe()
@werockstar editText.afterTextChangeEvents() .debounce(200, TimeUnit.MILLISECONDS) .distinctUntilChanged() .map { it.editable.toString() } .switchMap
{ api.getResult(it) .retry { attempt, throwable -> throwable is TimeoutException && attempt <= 2 } }.subscribe() .onErrorReturnItem("WeRockStar") ✅
@werockstar Reactively on precondition
@werockstar editText.afterTextChangeEvents() ... .switchMap { api.getResult(it) .retryWhen { it.flatMap {
throwable -> when (throwable.code()) { 401 -> api.getSomeToken("refresh_token") else -> Observable.error(throwable) } } } }.subscribe() 1 2
@werockstar And finally Delay error notification
@werockstar Observable.mergeDelayError( api.delete1(), api.delete2(), api.delete3() ).subscribe()
@werockstar And then
@werockstar Build in solutions
@werockstar Complex solution for complex problem
@werockstar Reactive Data Flow Back Pressure Flow Control Subject Push/Pull
Hot/Cold Messaging Responsive Elastic Publish/Subscribe Resilience Stream
@werockstar 80 Years of Life 5 ปีหมดไปการลองใช้ Rx 10 ปีหมดไปกับ
Observable 25 ปีหมดไปกับ FlatMap ส่วน 40 ปีที่เหลือหมดไปกับการทำความเข้าใจ และอธิบาย Reactive
@werockstar Questions and Answers @werockstar Thank you