在Android開發中常常面臨的問題: (1)在應用程序(Activity、Fragment)的生命週期管理困難,尤爲是Fragment的跳轉帶來的生命週期管理問題。 (2)在Activity須要從新建立的時候,界面控制器(View層)中存儲的數據丟失,須要從新初始化,影響用戶體驗。 (3)Android的異步操做(DB,NetWork)時,在界面控制器(View層)被銷燬後,界面控制器須要結束和任務的訂閱關係,避免內存泄漏和沒必要要的信息回調。 (4)Android的後臺服務和任務愈發困難。主要是因爲Android系統的DOZE省電模式,以及後來對於後臺任務和服務的限制。 (5)用戶偏好設置和網絡請求數據的本地存儲問題。html
針對以上問題,Google推出Android Jetpack框架來解決以上問題。Jetpack主要分爲4個部分(下圖): 基礎、架構、行爲、界面 。java
同時Google也推出 AndroidX 庫,AndroidX 是對support library的重大改進。在AndroidX中將全部軟件包名都以字符串**androidx.**開頭,位於一致的命名空間中。使用Android Jetpack組件的優點: (1)Lifecycles輕鬆管理應用程序的生命週期。 (2)LiveData構建可觀察的數據對象,以便在基礎數據更改時通知視圖。 (3)ViewModel存儲在應用程序輪換中未銷燬的UI相關數據,在界面重建後恢復數據。 (4)Room輕鬆的實現SQLite數據庫。 (5)WorkManager系統自動調度後臺任務的執行,優化使用性能。 (6)Navigation導航組件輕鬆管理Fragment等頁面跳轉問題。android
google推薦的基於Jetpack的Android客戶端軟件開發架構圖: (1)經過定義Repository管理數據來源(Model)。 (2)使用LiveData驅動界面(View)更新。 (3)使用ViewModel代替Presenter管理數據(VM)。 (4)Room(Sqlite)儲存本地序列化的數據,Retrofit獲取遠程數據的數據。web
關於該架構的疑問:該模式的是MVP仍是MVVM架構? 算法
與傳統的MVP架構相比有如下優勢: (1)在MVP架構中,Presenter中持有View層的引用,若是生命週期處理不當,會存在內存泄露的風險。在MVVM架構中View層和VM層經過LiveData通訊,避免了內存泄漏。。 (2)傳統MVP架構因爲各層之間的通訊是經過接口,因此會致使接口數量驚人,上訴架構經過觀察者模式(LiveData)避免了接口問題。數據庫
若是在上訴架構中加入Databidning。實現View和Model的雙向綁定接能夠演變成MVVM架構。可是基於DataBinding的MVVM架構有以下缺點: (1)數據雙向綁定,致使View不可重用。 (2)經過DataBinding實現數據綁定,會增長Bug調試難度。 (3)業務的複雜,會帶來View頁面複雜,model層代碼也會增大。緩存
一句話概述: Paging主要是用來結合RecyclerView進行使用,是一種分頁加載解決方案,這樣Paging每次只會加載總數據的一部分。 Room是Google提供的一個ORM庫。。Paging&Room組合使用網絡
實現原理 原理圖: 數據結構
基於Jetpack的架構圖總結: 架構
架構圖: (1)View層:表示的Activity和Fragment等組件。 (2)ViewModel層:ViewModel存儲和View層相關的數據,能夠在View層從新繪製時恢復數據,並且負責和View層和倉庫層之間的通訊。 (3)倉庫層:負責從數據庫中獲取數據或者從網絡中獲取數據,並將數據返回給ViewModel層。 (4)數據層:數據層分爲網絡數據層(Retrofit)和是數據庫數據層(GreenDao)。 (5)View層和ViewModel層經過LiveData通訊,避免了接口的內存泄漏問題。 關於倉庫層存在必要性?:官網解析:地址 Repository modules handle data operations. They provide a clean API so that the rest of the app can retrieve this data easily. They know where to get the data from and what API calls to make when data is updated. You can consider repositories to be mediators between different data sources, such as persistent models, web services, and caches.
大體意識:
倉庫模塊負責處理數據操做,提供了一個乾淨的API使得獲取數據更加容易。倉庫層知道從何處獲取數據以及更新數據時要調用的API。你能夠認爲倉庫層是做爲中介在不經過的數據源之間,好比持久模型,Web服務,緩存等。
總結:遵循關注點分離原則 通過Repository中介層使得ViewModel不須要具體的數據來源,這樣就能夠根據需求將其交換爲其餘實現。