Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tī Android Siōng時行ê架構設計

Avatar for shiami shiami
October 28, 2017

Tī Android Siōng時行ê架構設計

Avatar for shiami

shiami

October 28, 2017
Tweet

More Decks by shiami

Other Decks in Programming

Transcript

  1. 話頭 • 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
  2. ⾃我紹介 • Ngôo Hê-bí (Ngôo Ka-bîng) • Android/iOS 開發者 (7冬)

    • Tsit-má是⾃由⼯作者 (freelancer) • GDG Koahsiung 組織者 (organizer) • Mā teh做huî-á、教Tâi-gí
  3. 哪會想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)
  4. 今仔Beh分張ê內容 • Tsit ê題⽬範圍put-tsí-á⼤ • 若無去hōo⽕燙--過,m ̄ 知疼 • M

    ̄ 知是按怎beh⽤,差tī tó-ūi • ⼤部份是整理,kauh參考資料 • Ē-sái轉--去ta ̍ uh-ta ̍ uh-á看 • Siōng尾有我ka-tī ê想法kap選擇
  5. 適合聽ê對象 • 對Android ê架構無概念、無寫過複雜ê app • 感覺async處理真麻煩 • 便若寫client app

    tio ̍ h tsiok痛苦 • 看無RxJava teh tshòng siánn • 想欲知影Architecture Components ê好處tī tó-ūi • 想欲參考建議ê架構設計
  6. 過去有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
  7. 過去有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)
  8. 過去有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)
  9. 過去有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)
  10. 過去有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)
  11. 過去Android kap架構相關siōng tsē ê問題 • Android ê基礎原件 • Activity, Fragment,

    Service, ContentProvider, BroadcastReceiver • Siōng⼤ê問題 • Lifecycle
  12. Fragment Lifecycle https://github.com/xxv/android-lifecycle • onAttach • onCreate • onCreateView •

    onViewCreate • onActivityCreated • onViewRestored • onStart • onResume • onPause • onStop • onDestroyView • onDestroy • onDetach
  13. 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
  14. 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複雜ê狀態管理問題
  15. Async call • I/O lóng需要async call • ⼤部份ê app其實lóng是「Client」 •

    Client基本上ē-sái看做是⼈kap資訊ê介⾯ • 透過「async call」來互動
  16. Async call • Async call • Kap Android Lifecycle是無kâng ê世界

    • Response啥物時陣會轉--來無⼈知 • 若tsiok tsē beh按怎管理 • Lifecycle • 狀態隨時lóng會改變 • Ài tsiok細膩管理其他元件ê狀態 • 2 ê kap做伙,問題lú複雜
  17. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  18. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  19. 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⽅向、換系統ê語⾔
  20. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  21. 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才有
  22. 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
  23. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe ̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  24. Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 例:Beh tshuē móo-mí-lâng ê

    github,伊ê repository ê星,有超過100 ê--ê 1. GET /users/user_id/repos 2. 過濾repo ê星有超過100 ê--ê
  25. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  26. 複雜ê 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流程真複雜
  27. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  28. 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
  29. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  30. 介⾯ê資料binding • Ài寫tsiok tsē giâ-kê ê code • findViewById •

    onClickListener • Ta ̍ k-ê UI元件 binding ê code • 無sánn好管理
  31. Android client ê 架構問題 • REST Client • Async call

    bái處理 • REST API 無合⽤ • Khe̍ h--tio ̍ h ê資料需要koh再轉換 • 複雜ê error狀態無好管理 • Giâ-kê ê程式碼 (Boilerplate codes) • 介⾯ê資料binding • 資料保存
  32. 資料保存 • 資料庫 • SQLite kap ContentProvider真麻煩 • SQLiteOpenHelper •

    Schema、migration • ContentProvider • Uri、query builder
  33. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  34. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  35. 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)
  36. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  37. 哪會beh⽤用ReactiveX • 過去因為Java ê特性,lóng會ùi OOP(Object- oriented Programming) ê 角度落去思考kap設計 •

    M ̄ -koh tī Android內底,ài⾯對Lifecycle kap async call ê複雜狀態,ùi時間kap資料liû ê角度 去看是較簡單--ê
  38. 哪會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資料
  39. 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)
  40. RxJava / RxAndroid / RxLifecycle • RxJava • Java版本ê ReactiveX

    • RxAndroid • Kap Android系統有相關ê部份 • RxLifecycle • START: subscribe • STOP: terminate
  41. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  42. Data Binding library • 官⽅ê support library • MVVM ê架構設計

    • 較簡單ê UI binding • M ̄ 免寫⼀堆giâ-kê ê程式碼 (XML) • Event handling (click) • Observable objects
  43. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  44. Realm Database • 優點 • 除了SQLite ê選擇 (NOSQL) • RealmObject,像ORM

    • 速度⼤部份比ORM, SQLite較緊 • Safe threading • Reactive架構 • ⼀直有teh更新,關⼼技術議題 • Open source
  45. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  46. 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
  47. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  48. 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
  49. Lifecycle-aware • M ̄ 免koh寫⼀堆控制ê code tī Activity/Fragment內 底 •

    override Activity.onStart() • override Activity.onStop() • Fire-and-forget components • Ka-tī管理ka-tī
  50. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  51. LiveData • 是1 ê observable data holder • Observer pattern

    • ⽽且是lifecycle-aware • Kan-na會tī有效ê lifecycle state ê時陣,khì更新 • STARTED a ̍ h-sī RESUMED • Kan-na會通知有效ê observers
  52. LiveData • 優點 • 確定UI會kap你ê資料kāng款 • Bē有memory leak • Activity若停⽌,bē

    koh crash • Bē koh ka-tī烏⽩控制lifecycle • Ē-sái⽤singleton,分享資源 • extend LiveData
  53. LiveData a ̍ h-sī RxJava • Kāng款是reactive • LiveData •

    入⾨較簡單 • RxJava • 概念較oh bat • Operators tsiânn厲害 • 有error管理
  54. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  55. 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
  56. Tī Android siōng時⾏行行ê 架構設計 • Retrofit • RxJava / RxAndroid

    / RxLifecycle • Data Binding library • Realm Database • Android Architecture Components • Lifecycle-aware • LiveData • ViewModel • Room
  57. Room • 比SQLiteHelper kap ContentProvider簡單tsiok tsē • 設定kám有比⼀般ê ORM libraries較簡單︖

    • 優點 • ⽀援observable queries (reactive queries) • ⽽且回傳ê ē-sái是LiveData objects a ̍ h-sī Flowable (RxJava 2) • 官⽅⽀援
  58. MVVM: Data Binding Library Realm Database Realm SDK RxJava /

    RxAndroid RxLifecycle Before Android Architecture Components
  59. RxJava 2 Flowable Realm Database Realm SDK After Android Architecture

    Components RealmResult LiveData RxJava / RxAndroid
  60. 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討論
  61. 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