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
75
Modern Android Development
werockstar
0
120
Disrupt Innovation
werockstar
0
51
Kotlin 101#1
werockstar
0
110
Android Reactive Programming
werockstar
0
150
Mobile Automate Testing
werockstar
0
69
Other Decks in Programming
See All in Programming
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
120
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
140
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
200
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
290
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
210
Webの地図
yosuke_furukawa
PRO
6
4.1k
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.4k
AI Agent時代のリアーキテクチャ戦略と実践
hokaccha
9
3.9k
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
300
アクセシビリティから考える情報設計
high_g_engineer
0
350
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
880
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Designing for Performance
lara
611
70k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
300
Navigating Team Friction
lara
192
16k
Faster Mobile Websites
deanohume
310
32k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.3k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
680
Code Review Best Practice
trishagee
74
20k
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