Android應用架構前世今生
作者:黃俊彬(http://huangjunbin.com/)
責編:錢曙光([email protected])
作者授權CSDN釋出,如需轉載請聯絡作者本人。
前言
Android的開發生態系統發展迅速,在開發Android的幾年的時間裡,用來構建Android應用的架構與技術一直在不斷進化。隨著專案的不斷更新迭代,應用的架構也有不一樣的變化。由於開發人員的數量、專案的業務複雜度、需求的開發時間、應用的使用量級,使用的技術架構也不相同。沒有最好的架構,只有最合適的。通過設計使程式模組化,做到模組內部的高聚合和模組之間的低耦合。這樣做的好處是使得程式在開發的過程中,開發人員只需要專注於一點,提高程式開發的效率,便於專案的後期維護。下面總結及彙總一下目前Android使用的主要應用架構及其優缺點和使用的學習心得,如有不對之處,歡迎交流糾正。
mvc
還記得以前學生時代學習.NET的時候,第一次接觸到專案架構叫三層架構。應用層、業務邏輯層及資料訪問層。mvc的思想其實也一樣,都是一種軟體設計典範,用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。Android的專案設計本身也是採用了mvc的設計思想。
- 檢視層(View)
一般採用XML檔案進行介面的描述,使用的時候可以非常方便的引入。同時便於後期介面的修改。邏輯中與介面對應的id不變化則程式碼不用修改,大大增強了程式碼的可維護性。 - 控制層(Controller)
Android的控制層主要就是Activity層。相關View層互動觸發及資料展示邏輯都在Activity中進行編碼。 - 模型層(Model)
我們通常針對業務資料,都會定義好對應的Model層。資料庫的操作、對網路等的操作都應該在Model裡面處理,當然對業務計算等操作也是必須放在的該層的
所以一直以來我們使用Android預設的專案結構開發,主要都是在採用mvc的架構思想。
優點: 適用了簡單的頁面展示,業務邏輯不復雜。開發效果高,程式碼層級也簡單易懂
缺點: 當業務複雜時,Activity非常臃腫,不便於維護及測試
mvp
mvp這是目前我們專案中主要採用的應用架構方式,MVP從更早的MVC框架演變過來,與MVC有一定的相似性:Controller/Presenter負責邏輯的處理,Model提供資料,View負責顯示。mvp架構的演變,解決了Activity程式碼臃腫的問題,當我們將Activity複雜的邏輯處理移至另外的一個類(Presenter)中時,Activity其實就是MVP模式中的View,它負責UI元素的初始化,建立UI元素與Presenter的關聯(Listener之類),同時自己也會處理一些簡單的邏輯(複雜的邏輯交由 Presenter處理)。專案開發中,UI是容易變化的,且是多樣的,一樣的資料會有N種顯示方式;業務邏輯也是比較容易變化的。為了使得應用具有較大的彈性,我們期望將UI、邏輯(UI的邏輯和業務邏輯)和資料隔離開來,而MVP是一個很好的選擇。在MVP模式裡通常包含3個要素(加上View interface是4個):
- View:負責繪製UI元素、與使用者進行互動(在Android中體現為Activity)
- Model:負責儲存、檢索、操縱資料(有時也實現一個Model interface用來降低耦合)
- Presenter:作為View與Model互動的中間紐帶,處理與使用者互動的負責邏輯。
- View interface:需要View實現的介面,View通過View interface與Presenter進行互動,降低耦合,方便進行單元測試
優點:
- Model與View完全分離,修改互不影響
- 更高效地使用,因為所有的邏輯互動都發生在一個地方—Presenter內部
- 一個Preseter可用於多個View,而不需要改變Presenter的邏輯(因為View的變化總是比Model的變化頻繁)。
- 更便於測試。把邏輯放在Presenter中,就可以脫離使用者介面來測試邏輯(單元測試)
缺點:需要拿捏好Presenter、View interface的顆粒度設計,容易出現Presenter過於簡單或則複雜化。
mvvm
MVVM可以算是MVP的升級版,其中的VM是ViewModel的縮寫,ViewModel可以理解成是View的資料模型和Presenter的合體,ViewModel和View之間的互動通過Data Binding完成,而Data Binding可以實現雙向的互動,這就使得檢視和控制層之間的耦合程度進一步降低,關注點分離更為徹底,同時減輕了Activity的壓力
- View(檢視層)採用XML檔案進行介面的描述;
- Model(模型層)通過網路和本地資料庫獲取檢視層所需資料;
- ViewModel(檢視-模型層)負責View和Model之間的通訊,以此分離檢視和資料。
View和Model之間通過Android Data Binding技術,實現檢視和資料的雙向繫結;ViewModel持有Model的引用,通過Model的方法請求資料;獲取資料後,通過Callback(回撥)的方式回到ViewModel中,由於ViewModel與View的雙向繫結,使得介面得以實時更新。同時,介面輸入的資料變化時,由於雙向繫結技術,ViewModel中的資料得以實時更新,提高了資料採集的效率。
採用ViewModel解決MVP中View(Activity)和Presenter相互持有對方應用的問題,介面由資料進行驅動,響應介面操作無需由View(Activity)傳遞,資料的變化也無需Presenter呼叫View(Activity)實現,使得資料傳遞的過程更加簡潔,高效。
推薦教程:
優點:
- 雙向繫結技術,當Model變化時,View-Model會自動更新,View也會自動變化。很好做到資料的一致性
- Google官方支援databing,易於整合
缺點:
- 資料繫結使得 Bug 很難被除錯
- 資料雙向繫結不利於程式碼重用及擴充套件
- 程式碼的閱讀性降低
android-architecture
google在官方示例中給出了一系列不同架構的app實現,專案目的是通過展示各種架構app的不同方式來幫助開發者解決架構問題。專案中通過不同的架構概念及方式實現了功能相同的app。
TODO-MVP-RXJAVA
使用RXJAVA對資料流進行處理,並且通過Repository進行資料的集中管理,通過協議類XXXContract來對View和Presenter的介面進行內部繼承,在presenter的實現類中,可以對Model資料進行操作。例項中,資料的獲取、儲存、資料狀態變化都是model層的任務,presenter會根據需要呼叫該層的資料處理邏輯並在需要時將回調傳入。這樣model、presenter、view都只處理各自的任務,實現單一責任原則。
推薦教程:
元件化
隨著專案的推進,及企業業務的發展。有一天可以發現團隊內部需要開發多個APP,且多個APP中存在相同的業務模組,一開始的做法為了趕專案進度可能就是黏貼複製,到後面就慢慢發現越來越吃力,重複勞動。
慢慢隨著時間的推移,惡性迴圈。慢慢發現專案程式碼結構混亂、層次不清,各業務技術方案不統一;甚至連基本的包結構也是胡亂不堪,都是不停地往上堆砌程式碼新增新功能,前人挖坑後人填。可見元件化對於不斷迭代的專案有著深遠的意義
- 避免重複造輪子,提高開發效率
- 減低耦合度,提高複用性
- 保持團隊的技術方案統一性
- 便於維護升級
基礎元件化
通常專案中常用的結構如下:
看似沒什麼問題,但通常我們的一些庫都是以程式碼的形式整合在程式碼中,隨著專案推進,慢慢發現一些比較嚴重的問題。
- 業務程式碼侵入元件程式碼中 (例如一些全域性的網路返回響應,直接在庫中編碼等)
- 團隊內部沒約束,各自整合不同的基礎庫(例如圖片載入有的用Glide,有的用ImageLoader)
- 部分第三方元件停止更新,專案程式碼耦合高,替換新方案難
所以在實際設施元件化的過程中,建議參考:
- 獨立library庫(Common基礎元件),避免在主工程中直接以程式碼整合,使用aar方式引用
- 第三方的庫呼叫最好再裝一層介面,以便後續維護升級
- 有成員專門負責維護,可以以SDK的方式提供業務層的呼叫
業務模組化
隨著專案邏輯不斷的增加,慢慢是不是發現程式碼編譯速度是不是越來越慢?(PS:我們目前專案編譯一次2分鐘,且已是經過一些優化處理)
另外當團隊內部有多個專案時,是不是經歷過產品經理讓你把專案A的某個功能移到專案B去,這個時候… …
業務模組化的作用性就很明顯了
- 業務模組間避免耦合,提高複用性
- 業務模組獨立編譯執行
推薦教程:
思考
- 專案架構都是不斷演進,不是一蹴而就
- 沒有最好的架構,只有在適當的時機,最合適的架構
- 專案重構過程是艱難的,但長痛不如短痛
相關推薦
Android應用架構前世今生
作者:黃俊彬(http://huangjunbin.com/) 責編:錢曙光([email protected]) 作者授權CSDN釋出,如需轉載請聯絡作者本人。 前言 Android的開發生態系統發展迅速,在開發Andro
Android應用架構分析
描述 nal 目的 manifest 分析 colors 內部類 roi ldp 一、res目錄: 1、屬性:Android必需; 2、作用:存放Android項目的各種資源文件。這些資源會自動生成R.java。 2.1、layout:存放界面布局文件。
谷歌官方Android應用架構庫--LiveData
LiveData 是一個數據持有者類,它持有一個值並允許觀察該值。不同於普通的可觀察者,LiveData 遵守應用程式元件的生命週期,以便 Observer 可以指定一個其應該遵守的 Lifecycle。 如果 Observer 的 Lifecycle 處於 STAR
Android應用架構之Retrofit使用
網路訪問框架經過了從使用最原始的AsyncTask構建簡單的網路訪問框架(甚至不能稱為框架),後來使用開源的android-async-http庫,再到使用google釋出的volley庫,一直不懈的尋找更好的解決方案(銀彈),到現在雖然銀彈沒找到,也算找 到了一些更好的
Android應用架構之Retrofit、RxAndroid使用
上篇部落格客http://blog.csdn.net/liuhongwei123888/article/details/50375283 已經介紹了Retrofit的簡單使用方法,接下來介紹的是在Retrofit中怎麼使用RxAndroid,如果還不瞭解RxAn
谷歌官方Android應用架構庫——Room 持久化庫
架構庫版本:1.0.0 Alpha 2 - June 2, 2017 Room提供了一個SQLite之上的抽象層,使得在充分利用SQLite功能的前提下順暢的訪問資料庫。 對於需要處理大量結構化資料的App來說,把這些資料做本地持久化會帶來很大的好處。常見的
谷歌官方Android應用架構庫(Android Architecture Components)學習完整版
架構庫版本:1.0.0 Alpha 2 - June 2, 2017 1 導語 本次 Google IO 大會不僅確立了 Kotlin 為安卓開發的官方語言,不為人注意是,還發布了谷歌官方 Android 應用架構庫。這個新的架構庫旨在幫助我們設計健壯、
通用Android應用架構:從建專案開始
1.專案結構 現在的MVP模式越來越流行。就預設採用了。 如果專案比較小的話: app——Application Activity Fragment Presenter等的頂級父類 config——API,常量表等 model——資料層 entit
Android 官方架構元件 ViewModel:從前世今生到追本溯源
爭取打造 Android Jetpack 講解的最好的部落格系列: Android官方架構元件Lifecycle:生命週期元件詳解&原理分析 Android官方架構元件ViewModel:從前世今生到追本溯源 Android官方架構元件Paging:分頁庫的設計美學
Android OpenGL ES 入門系列(一) --- 了解OpenGL ES的前世今生
target 初始化 vertex 單獨 http hang tex 變化 3d圖 轉載請註明出處 本文出自Hansion的博客 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三維圖形 API 的子集,
區塊鏈的前世今生:走向高可靠企業應用
watermark [1] 技術 核心 小米 per iba aide HERE 2009年一個筆名為中本聰的人在密碼學論壇中發布了一篇名為《比特幣----一種點對點的電子現金系統》的文章,比特幣這一概念就此誕生。而其背後的區塊鏈技術則在近十年的時間長河中逐漸浮出水面:從密
Android官方架構組件介紹之應用(四)
怎麽 nbsp 註冊 bool 其他 info get inf prot 講一個項目常見的功能,友盟統計功能 例如一個項目有很多多modlue,每個裏面modlue都有Activity,Activity需要友盟統一,Fragment也需要友盟統計。一般做法就是繼承一個Bas
Android 性能篇 -- 帶你領略Android內存泄漏的前世今生
http 外部類 sched content 技術 oncreate 保持 roi 作用域 基礎了解 什麽是內存泄漏? 內存泄漏是當程序不再使用到的內存時,釋放內存失敗而產生了無用的內存消耗。內存泄漏並不是指物理上的內存消失,這裏的內存泄漏是指由程序分配的內存但是由於程序邏
Android和iOS的前世今生
Android和iOS的區別(從開發角度比較) 一、Android、ios發展史: https://www.jianshu.com/p/3fbab95bbb60 https://www.jianshu.com/p/aa3758739145 二、Android和iOS的區別(從
Android 效能篇 -- 帶你領略Android記憶體洩漏的前世今生
基礎瞭解 什麼是記憶體洩漏? 記憶體洩漏是當程式不再使用到的記憶體時,釋放記憶體失敗而產生了無用的記憶體消耗。記憶體洩漏並不是指物理上的記憶體消失,這裡的記憶體洩漏是指由程式分配的記憶體但是由於程式邏輯錯誤而導致程式失去了對該記憶體的控制,使得記憶體浪費。 Java
小白學安卓(一):Android系統架構和應用開發特色
一、Android架構 Android大致可以分為四層架構: Linux核心層 系統執行庫層 應用框架層 應用層 Linux核心層 Android系統是基於Linux核心的,這一層為Android裝置的各種硬體提供了底層的驅動,如顯示驅動
神經網路的前世今生及應用
本文由微言創新(InnoTalk)授權轉載,作者:金城 復旦大學副教授,博士生導師 AlphaGo、無人駕駛、人臉識別、智慧翻譯……這一個個耳熟能詳的名詞無不預示著人工智慧時代的到來。人工智慧的本質,是對人的思維過程和行為方式的模擬。研究人的認知機理,引入人的神經元概念,勢
Android零基礎入門第1節:Android的前世今生
現在網上有很多各色Android資料了,但相對來說還是比較零散,Android覆蓋的範圍極廣,最近剛好有機會全部拉通整理一遍,也儲存起來方便後期學習。 這一系列資料從最初的Android認識到Android高階開發,會免費共享出來分享給大家,包括中間會涉及到的一些原始碼
【架構拾集】: Android 移動應用架構設計
在這一個多月裡,我工作在一個採用外掛化的原生 Android 應用專案上。隨著新技術的引入,及編