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
Tī Android Siōng時行ê架構設計
Search
shiami
October 28, 2017
Programming
820
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Tī Android Siōng時行ê架構設計
shiami
October 28, 2017
More Decks by shiami
See All by shiami
學台語ê好ke-si - ChhoeTaigi & PhahTaigi
shiami
0
280
台語嘛會使拍字?!Phah Tâi-gí 輸入法作者分享
shiami
0
800
Realm Database Hands On (GDG Kaohsiung #43)
shiami
1
90
Clean Android Client Architecture with Rx and MVVM (GDG Kaohsiung #27)
shiami
3
1.1k
Other Decks in Programming
See All in Programming
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
290
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
4.8k
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
330
Heart of Swift Concurrency
koher
0
1.1k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
410
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
750
Workers Cache を知る
syumai
0
320
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
190
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
300
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.1k
Why Our Code Smells
bkeepers
PRO
340
58k
How STYLIGHT went responsive
nonsquared
100
6.3k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
470
Marketing to machines
jonoalderson
1
5.8k
Music & Morning Musume
bryan
48
7.4k
Building AI with AI
inesmontani
PRO
1
1.3k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
910
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
410
Balancing Empowerment & Direction
lara
6
1.3k
Transcript
Tī Android Siōng時⾏ê架構設計 Modern Android Architecture Design Patterns Ngôo Hê-bí,
@MOPCON, 2017/10/28
話頭 • This talk will be given in Taiwanese (Tâi-gí)
• These slides are written in Taiwanese (Tâi-gí jī) • Why? • UNESCO Universal Declaration on Cultural Diversity 2001 • (聯合國教科⽂組織 世界⽂化多樣性宣⾔) • My mother language is Taiwanese (Tâi-gí) • MOPCON is at Kaohsiung
⾃我紹介 • Ngôo Hê-bí (Ngôo Ka-bîng) • Android/iOS 開發者 (7冬)
• Tsit-má是⾃由⼯作者 (freelancer) • GDG Koahsiung 組織者 (organizer) • Mā teh做huî-á、教Tâi-gí
Tī Android Siōng時⾏ê架構設計 Modern Android Architecture Design Patterns
哪會想beh講tsit ê題⽬︖ • MOPCON 過去無⼈講--過,tsiânn bô-tshái • 較基礎ê問題,差不多lóng hông解決--ah •
App開發公司lú來lú穩定,需要較好維護ê架構 • App增加ê功能lú來lú tsē,lú複雜 • Tsit幾冬tī Android社群⼀直teh討論 • Android架構pháinn處理ê問題已經⾜久,Google 總算提出解決ê法度 (2017 Google I/O)
今仔Beh分張ê內容 • Tsit ê題⽬範圍put-tsí-á⼤ • 若無去hōo⽕燙--過,m ̄ 知疼 • M
̄ 知是按怎beh⽤,差tī tó-ūi • ⼤部份是整理,kauh參考資料 • Ē-sái轉--去ta ̍ uh-ta ̍ uh-á看 • Siōng尾有我ka-tī ê想法kap選擇
適合聽ê對象 • 對Android ê架構無概念、無寫過複雜ê app • 感覺async處理真麻煩 • 便若寫client app
tio ̍ h tsiok痛苦 • 看無RxJava teh tshòng siánn • 想欲知影Architecture Components ê好處tī tó-ūi • 想欲參考建議ê架構設計
過去有tī Android 討論過ê架構設計 Android Architecture Design Patterns
過去有tī Android討論過ê架構設計 • MVC • MVP • MVVM • Clean
Architecture
過去有tī Android討論過ê架構設計 • MVC • MVP • MVVM • Clean
Architecture
過去有tī Android討論過ê架構設計 • MVC vs. MVP vs. MVVM on Android
• https://academy.realm.io/ posts/eric-maxwell-mvc- mvp-and-mvvm-on- android/ • https://github.com/ ericmaxwell2003/ ticTacToe
過去有tī Android討論過ê架構設計 • MVC • MVP • MVVM • Clean
Architecture
過去有tī Android討論過ê架構設計 • Uncle Bob (Robert C. Martin) • Clean
Architecture (2012) • Fernando Cejas • Architecting Android...The clean way? (2014) • Tomislav Homan • Applying clean architecture on Android (2016)
過去有tī Android討論過ê架構設計 • Uncle Bob (Robert C. Martin) • Clean
Architecture (2012) • Fernando Cejas • Architecting Android...The clean way? (2014) • Tomislav Homan • Applying clean architecture on Android (2016)
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
分層ê架構 Layered architecture
過去有tī Android討論過ê架構設計 • Uncle Bob (Robert C. Martin) • Clean
Architecture (2012) • Fernando Cejas • Architecting Android...The clean way? (2014) • Tomislav Homan • Applying clean architecture on Android (2016)
https://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
https://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
過去有tī Android討論過ê架構設計 • Uncle Bob (Robert C. Martin) • Clean
Architecture (2012) • Fernando Cejas • Architecting Android...The clean way? (2014) • Tomislav Homan • Applying clean architecture on Android (2016)
http://five.agency/android-architecture-part-3-applying-clean-architecture-android/
http://five.agency/android-architecture-part-3-applying-clean-architecture-android/ 實際ê modules
http://five.agency/android-architecture-part-3-applying-clean-architecture-android/ 實際ê modules
http://five.agency/android-architecture-part-3-applying-clean-architecture-android/ 實際ê modules
http://five.agency/android-architecture-part-3-applying-clean-architecture-android/ 實際ê modules
http://five.agency/android-architecture-part-3-applying-clean-architecture-android/ 實際ê modules
已經有bē bái ê 架構設計
Android開發應該是 無kài困難?
過去Android kap架構 相關siōng tsē ê問題 The real-world problems of Android
architecture
過去Android kap架構相關siōng tsē ê問題 • Android ê基礎原件 • Activity, Fragment,
Service, ContentProvider, BroadcastReceiver • Siōng⼤ê問題 • Lifecycle
Activity Lifecycle • onCreate • onStart • onResume • onPause
• onStop • onRestart • onDestroy
Fragment Lifecycle https://github.com/xxv/android-lifecycle • onAttach • onCreate • onCreateView •
onViewCreate • onActivityCreated • onViewRestored • onStart • onResume • onPause • onStop • onDestroyView • onDestroy • onDetach
過去Android kap架構相關siōng tsē ê問題 • Siōng⼤ê問題哪會是Lifecycle︖ 1. App元件是ē-sái hông隨時使⽤a ̍
h-sī結束--ê 2. Async call
過去Android kap架構相關siōng tsē ê問題 • 哪會是Lifecycle︖ 1. App元件是ē-sái hông隨時使⽤a ̍
h-sī結束--ê 2. Async call
App元件是ē-sái hông隨時使⽤a ̍ h-sī結束--ê • 看1 ê例 • Phah開Facebook app,beh分張1張相⽚
• Beh hip-siōng,跳去相機ê app • 可能你beh選hip好ê相⽚,跳去選檔案ê app • 若koh有⼈khà電話來 • 繼續本來ê動作 • Uploading
App元件是ē-sái hông隨時使⽤a ̍ h-sī結束--ê • Sóo-pái • App元件lóng是短命--ê • In
ê lifecycle lóng m ̄ 是你ē-tàng控制--ê • 需要真細膩去處理你app ê狀態 • Tiānn-tiānn會tsō-sîng複雜ê狀態管理問題
過去Android kap架構相關siōng tsē ê問題 • 哪會是Lifecycle︖ 1. App元件是ē-sái hông隨時使⽤a ̍
h-sī結束--ê 2. Async call
Async call • I/O lóng需要async call • ⼤部份ê app其實lóng是「Client」 •
Client基本上ē-sái看做是⼈kap資訊ê介⾯ • 透過「async call」來互動
Async call • 「Async call」tī Android內底ê情形︖ • Async call是tī「worker thread」
• Lifecycle是tī「main thread」
Async call • Async call • Kap Android Lifecycle是無kâng ê世界
• Response啥物時陣會轉--來無⼈知 • 若tsiok tsē beh按怎管理 • Lifecycle • 狀態隨時lóng會改變 • Ài tsiok細膩管理其他元件ê狀態 • 2 ê kap做伙,問題lú複雜
因為⼤大部份ê app lóng是client app
Android client ê 架構問題 The problems of Android client architecture
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
Async call bái處理理 • Tī Android ê lifecycle內底,beh處理async call是 真複雜ê代誌,ài管理無kâng
ê狀態 • Client tiānn-tiānn會同齊有kúi-nā ê async call teh ⾛,管理真麻煩 • AsyncTask︖Volley︖Kám好⽤︖ • Configuration changes • ⼿機仔tńg⽅向、換系統ê語⾔
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
REST API ê組合 • 若是有ka-tī團隊負責backend ê開發,API ē-sái ka-tī控制,就較無問題 • M
̄ -koh若是⽤別⼈服務ê API,tio ̍ h tiānn tú-tio ̍ h API無合⽤ê問題 • 可能beh ài ê 1筆資料,tio ̍ h需要request tsiok tsē kái才有
REST API ê組合 • 例:Beh tshuē móo-mí-lâng ê github,伊ê repositories
1. GET /user • "repos_url": “https://api.github.com/users/ user_id/repos” 2. GET https://api.github.com/users/user_id/repos
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe ̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 例:Beh tshuē móo-mí-lâng ê
github,伊ê repository ê星,有超過100 ê--ê 1. GET /users/user_id/repos 2. 過濾repo ê星有超過100 ê--ê
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
複雜ê error狀態無好管理 • 例:你beh lia ̍ h你Facebook全部600 ê朋友ê資 料,API ài分⾴去khe̍
h,1 pái kan-na khe̍ h會tio ̍ h 100筆,ài討6 pái才討會完 • 1 pái送6 ê API call • 若其中1 ê API call有問題 • Error流程真複雜
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
Giâ-kê ê程式碼 (Boilerplate codes) • 例:你beh lia ̍ h你Facebook全部600 ê朋友ê資
料,API ài分⾴去khe̍ h,1 pái kan-na khe̍ h會tio ̍ h 100筆,ài討6 pái才討會完 • 第1 ê API call了,才ē-sái接第2 ê,koh suah-- 落-去... • 若⽤AsyncTask寫 • onPostExecute內底ài寫幾層︖ • Callback hell
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
介⾯ê資料binding • Ài寫tsiok tsē giâ-kê ê code • findViewById •
onClickListener • Ta ̍ k-ê UI元件 binding ê code • 無sánn好管理
Android client ê 架構問題 • REST Client • Async call
bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
資料保存 • 資料庫 • SQLite kap ContentProvider真麻煩 • SQLiteOpenHelper •
Schema、migration • ContentProvider • Uri、query builder
Suah--來來,lán來來看 有啥物解決ê步數
Tī Android siōng時⾏ê 架構設計 Modern Android Architecture Design Patterns
先講結論, 我ka-tī ê選擇是...
RxJava 2 Flowable Realm Database Realm SDK RxJava RealmResult LiveData
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
None
Retrofit • Siōng出名mā siōng好⽤用ê client library • 無需要寫tsiok tsē giâ-kê
ê 程式碼 • 使⽤用簡單,mā有彈性 • Ē-sái選你kah-ì ê JSON converter • ⽤用OkHttp做連線ê基礎 • ⽀支援sync call & async call • ⽀支援RxJava / RxJava 2 (Retrofit adapters)
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
None
哪會beh⽤用ReactiveX • 過去因為Java ê特性,lóng會ùi OOP(Object- oriented Programming) ê 角度落去思考kap設計 •
M ̄ -koh tī Android內底,ài⾯對Lifecycle kap async call ê複雜狀態,ùi時間kap資料liû ê角度 去看是較簡單--ê
None
事件驅動ê架構 Event-driven architecture
哪會beh⽤用ReactiveX • ReactiveX • Reactive programming • Observer pattern
哪會beh⽤用ReactiveX • Reactive programming • 解說真tsē款,mā無好理解 • 對初學者來講,beh到ē-hiáu⽤無簡單 • 簡單講tio
̍ h是「處理async資料liû ê程式」(programming with async data stream) • Observer pattern • Tī OOP內底1種design pattern • ⽤來實現reactive programming ê 1部份功能 • 接收async結果ê通知kap資料
時間 資料liû... 處理理 結果 處理async資料liû ê程式
RxJava koh ē-sái解決複雜ê問題 • Observable data stream (Observer pattern) •
Thread切換簡單 (RxAndroid) • Async call好處理理 (RxLifecycle) • Error好管理理 (onError:Exception) • 好⽤用ê operators • API組合 (zip operator) • 資料轉換 (map operator) • 資料過濾 (skip operator)
RxJava / RxAndroid / RxLifecycle • RxJava • Java版本ê ReactiveX
• RxAndroid • Kap Android系統有相關ê部份 • RxLifecycle • START: subscribe • STOP: terminate
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
Data Binding library • 官⽅ê support library • MVVM ê架構設計
• 較簡單ê UI binding • M ̄ 免寫⼀堆giâ-kê ê程式碼 (XML) • Event handling (click) • Observable objects
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
None
Realm Database • 優點 • 除了SQLite ê選擇 (NOSQL) • RealmObject,像ORM
• 速度⼤部份比ORM, SQLite較緊 • Safe threading • Reactive架構 • ⼀直有teh更新,關⼼技術議題 • Open source
Realm Database • ⽋點 • Query有⼀定ê限制 • APK size會變較⼤
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
Android Architecture Components • Architecture Components - Introduction (Google I/O
'17) • https://www.youtube.com/watch?v=FrteWKKVyzI • Architecture Components - Solving the Lifecycle Problem (Google I/O '17) • https://www.youtube.com/watch?v=bEKNi1JOrNs • Architecture Components - Persistence and Offline (Google I/O '17) • https://www.youtube.com/watch? v=MfHsPGQ6bgE
Android Architecture Components
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
Lifecycle • “android.arch.lifecycle” package • android.arch.lifecycle.Lifecycle是1 ê class,khǹg Activity/Fragment lifecycle
ê狀態,ē-sái hông觀察 • LifecycleOwner.getLifecycle() • 正式release了後,會增加到support library內底ê Activity/Fragment • Tsit-má暫時⽤LifecycleActivity/ LifecycleFragment
Lifecycle
Lifecycle-aware
Lifecycle-aware • M ̄ 免koh寫⼀堆控制ê code tī Activity/Fragment內 底 •
override Activity.onStart() • override Activity.onStop() • Fire-and-forget components • Ka-tī管理ka-tī
Lifecycle • Best practices for Lifecycles • https://developer.android.com/topic/ libraries/architecture/lifecycle.html#lc-bp
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
LiveData • 是1 ê observable data holder • Observer pattern
• ⽽且是lifecycle-aware • Kan-na會tī有效ê lifecycle state ê時陣,khì更新 • STARTED a ̍ h-sī RESUMED • Kan-na會通知有效ê observers
LiveData • 優點 • 確定UI會kap你ê資料kāng款 • Bē有memory leak • Activity若停⽌,bē
koh crash • Bē koh ka-tī烏⽩控制lifecycle • Ē-sái⽤singleton,分享資源 • extend LiveData
LiveData按怎⽤用 • Khǹg tī ViewModel內底
LiveData按怎⽤ • Observe
LiveData按怎⽤ • Update
LiveData a ̍ h-sī RxJava • Kāng款是reactive • LiveData •
入⾨較簡單 • RxJava • 概念較oh bat • Operators tsiânn厲害 • 有error管理
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
ViewModel • 設計beh來保存kap管理和UI相關ê資料
ViewModel • 優點 • 內底ê資料活過configuration changes • Thâi掉koh têng創造1 ê
Activity • Activity scope • 無kâng ê Fragment ē-sái⽤kāng 1 份資料 • Fragments互相溝通 • 比SavedInstanceState khǹg koh較tsē ê資料 • bundle:ài ē-sái serialized
ViewModel
ViewModel
Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid
/ RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
Room https://developer.android.com/topic/libraries/architecture/room.html
Room https://developer.android.com/topic/libraries/architecture/room.html
Room https://developer.android.com/topic/libraries/architecture/room.html
Room • 比SQLiteHelper kap ContentProvider簡單tsiok tsē • 設定kám有比⼀般ê ORM libraries較簡單︖
• 優點 • ⽀援observable queries (reactive queries) • ⽽且回傳ê ē-sái是LiveData objects a ̍ h-sī Flowable (RxJava 2) • 官⽅⽀援
Room vs. Realm Database https://academy.realm.io/posts/android-architecture-components-and-realm/ (Room)
Room vs. Realm Database https://academy.realm.io/posts/android-architecture-components-and-realm/ (Room)
Tī Android siōng時⾏ê 架構設計 我ka-tī ê版本
MVVM: Data Binding Library Realm Database Realm SDK RxJava /
RxAndroid RxLifecycle Before Android Architecture Components
Android Architecture Components
RxJava 2 Flowable Realm Database Realm SDK After Android Architecture
Components RealmResult LiveData RxJava / RxAndroid
Tī Android siōng時⾏行行ê 架構設計 • 以上是我ka-tī ê選擇,無⼀定是siōng好--ê,a ̍ h-sī適合 每1
ê⼈ • Bóng參考 • 若有koh較好ê想法,歡迎ta ̍ k-ê來交流 • Ē-sái等--leh來tshuē--我 • Mā ē-sái來GDG Kaohsiung討論
https://github.com/googlesamples/android-architecture
None
None
Android Architecture Components • Guide to App Architecture • https://developer.android.com/topic/
libraries/architecture/guide.html • Codelab • https://codelabs.developers.google.com/ codelabs/android-lifecycles/#0
https://www.facebook.com/groups/AKDGroup/
None
To-siā! Ngôo Hê-bí
[email protected]