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

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

shiami
October 28, 2017

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

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