潘鳳 江蘇聯合職業技術學院淮安生物工程分院
從功能手機到智能手機,從3G到4G再到如今的5G,手機中的APP越來越豐富,提供的功能越來越強大,涉及的領域越來越廣。在這背后,離不開移動生態和APP開發技術的不斷發展。在移動端操作系統市場中,Android操作系統占比超過了百分之七十。這幾年來,Android操作系統在不斷地迭代更新,同時,Android應用架構也不斷發展。最初的一代架構是MVC,但是Activity過于臃腫;為了解決該問題,出現了二代架構MVP,新增了presenter層,作為控制中心,分擔原來Activity中的部分功能,處理View于Model間的交互和業務邏輯;如今Android主流應用架構是MVVM,MVVM的出現解決了MVP架構中View層大量接口和實現類等問題,更加靈活高效。
MVVM架構共分為三層:Model層、View層、ViewModel層。Model表示模型層,主要負責獲取視圖層所需要的數據,數據源通常是網絡和本地數據庫。View層是視圖層,主要負責界面的繪制和交互,Android項目的View層通常是XML和Activity;ViewModel層是視圖-模型層,主要負責業務邏輯的處理,串聯View層與Model層間,當Model層更改時,ViewModel層反饋給View層,引發頁面的刷新。Android項目中引入MVVM架構可以帶來以下幾點優勢。
1.各層級低耦合
MVVM架構中,數據模塊和界面模塊是相互獨立的,通過ViewModel建立關聯。單純從數據的角度來看,Model負責提供數據,ViewModel負責處理數據,View負責展示數據。View層想展示什么樣的樣式,完全由自己決定。如果View層的樣式發生變化,只要數據格式不變,那么ViewModel層和Model層就不需要做任何改動。如果Model數據源發生了變化,只要數據格式不變,那么View層也不需要做任何改動。而在MVC或者MVP架構中,當界面樣式改變時,可能就需要改變獲取控件的方式,改變更新界面的接口等等。
2.雙向綁定、數據驅動
在MVVM架構中,可以通過數據綁定框架實現數據和控件的雙向綁定,當數據改變時會自動驅動View層更新,View層控件改變時可以自動反饋到數據上,這樣ViewModel層可以專注于處理數據和業務邏輯,不需要去關注View層的邏輯,比如如何獲取用戶的輸入,如何更新界面,如何獲知用戶的交互事件等等。View層和ViewModel層之間通過數據進行串聯,一方改變都會自動影響另外一方。每一層只關注自己的事情,整個項目的結構非常清晰明了。
3.團隊協作,提高效率
在MVVM架構下,各層級之間的耦合程度很低,所以可以根據層級對整個項目進行劃分,進而明確地分工,這樣極大地提高了個人和整個團隊的開發效率。
4.可復用性
如果對于同一份數據,需要多種樣式進行展示,那么同一個ViewModel就可以供多個View使用。如果由于需求的變化導致樣式不斷變化,那么我們只需要更改對應的View層就可以了。
5.易于測試
由于ViewModel層和View層是相互獨立的,一個專注于數據和業務邏輯的處理,一個專注于界面的繪制和交互,那么開發人員在做單元測試的時候,可以對兩個層級分別進行測試,極大地方便了測試。
6.優化代碼
Android中findViewById等模式化代碼無需手動編寫,MVVM中的數據綁定框架可以直接完成該工作,極大地提高了工作效率,同時還可以提高XML布局文件的解析速度。
2015 年谷歌在Google I/O上提出了Data Binding庫,目的是減少Android開發中的大量模板代碼(setText等),增加代碼及邏輯清晰度,提高開發效率和維護效率。同時,這也意味著,在Android開發中支持MVVM的開發模式,Data Binding可以使得數據對象直接綁定到XML布局文件中,數據發生變化時會直接反映到View上;View狀態發生變化時也會反應到數據上。Android項目中使用Data Binding搭建MVVM架構,需要以下幾個步驟:
1.利用Data Binding搭建View層。引入Data Binding框架后,XML布局文件和原始文件相比,增加了layout標簽和data標簽。data標簽用來綁定數據對象,這樣布局標簽就可以直接使用變量中的屬性。Activity中需要使用Data Binding綁定對應的布局文件和數據對象,數據對象需要實現Observable接口,這樣數據對象就有了更新通知能力,一旦數據層的對象發生變化,View層就會自動完成相應的變化。
2.搭建ViewModel層。ViewModel層主要負責業務邏輯的處理,持有ObservableField等View層所需要的數據對象,還有Model層的對象。通過Model層對象調用接口獲取數據,獲取數據成功后給ObservableField等數據對象賦值,一旦數據的值發生變化后,View層對應的頁面就會刷新。
Data Binding搭建的MVVM架構有很多優點,比如雙向綁定技術可以讓數據的一致性很好、增強了View層和ViewModel層聯動性、減少了很多模式化代碼、自動判空技術減少了低級錯誤的發生等等。但是,Data Binding框架也有一些缺陷,首先Data Binding框架對XML布局文件的侵入性比較大,增加了學習成本,同時還影響了XML布局文件的復用性;其次,由于XML布局文件無法進行調試,而數據綁定讓一部分邏輯轉移到了XML布局文件中,所以增加了代碼調式的難度,可能會出現BUG定位困難的情況。還有,Data Binding框架是基于數據驅動的,當某個模塊的業務邏輯比較復雜的時候,那么Model層的數據往往會比較大。但是數據只有在頁面銷毀的時候統一釋放,而不能根據View的生命周期釋放,所以總的來說,項目占用的內存增大了。
在這之后,谷歌在2017年Google I/O大會上宣布了一個全新的架構組件Android Architecture Components,我們后面簡稱AAC。Google官方對該框架的說明是:這是一個幫助構建穩定,易于測試和易于維護的App架構的庫。該框架主要包含ViewModel、LiveData、Room三個核心組件。
1.ViewModel組件
在以往的項目架構中,由于沒有ViewModel這一層,所以相關數據都存儲在Activity或者Fragment中,而Activity和Fragment都有自己的生命周期,在特殊的情況下會發生銷毀或者重新創建,這時候存儲在Activity或者Fragment中的數據會隨著頁面的銷毀而消失,雖然Activity 可以使用 onSaveInstanceState方法存儲和恢復相關的數據,但是這只適用于少量的數據。AAC框架中的ViewModel組件很好地解決了這個問題,ViewModel組件旨在以注重生命周期的方式存儲和管理界面相關的數據,它能夠承擔保存數據的責任,把數據從界面中分離出來。同時,ViewModel也有自己的生命周期,和Activity、Fragment等組件的生命周期相匹配,這樣當遇到界面銷毀重建的情況時能夠很好地保存數據,然后及時地恢復到界面上。
2.LiveData 組件
LiveData 能夠感知Activity、Fragment等組件的生命周期。當Activity等組件銷毀時,LiveData也會被退訂,這樣就有效地避免部分內存泄露問題。LiveData組件把View層和ViewModel層串聯了起來,一旦數據發生了變化,就會通知View層,界面便會做出響應。
3.Room 組件
Room組件是在Android本地數據庫基礎上封裝的一個組件,可以提供強大的數據庫功能。Room組件在MVVM架構中不是必須的,可以根據自己項目的需求選擇。
我們利用AAC框架可以很輕松地搭建一個MVVM架構的項目。搭建流程主要是:ViewModel組件作為MVVM架構中的ViewModel層,Activity和XML布局文件作為View層,LiveData作為可觀察的數據存儲器類在ViewModel層被創建,在View層中被觀察,從而完成View層和ViewModel層的綁定。對比單純Data Binding框架搭建的MVVM架構,AAC框架更加地完善和合理,對于Android開發者來說更加地友好。當然,也可以在AAC框架的基礎上結合Data Binding框架,這需要根據項目的具體情況進行考量。
總的來說,架構的引入目的是為了使項目結構更加合理,一個合理的架構可以使項目模塊內部高聚合、模塊之間低耦合。在項目開發的過程中,可以讓開發人員只需要專注于某個模塊或者某個業務,分工更加地合理,極大提高個人開發效率和團隊的開發效率。架構的引入往往并不意味著代碼量的減少,甚至可能會使代碼量增多,因為我們引入項目架構的目的是為了項目在邏輯上更簡單,讓整個項目的質量、可擴展性、可維護性等得到提高。MVVM架構的諸多優點可以讓項目穩健性更強、可測試性更好、可維護性更高。