談談Android項目框架的前世今生


嗨,大家好,今天出了大太陽,真是美好的開始。
這篇文章和大家說說Android屆流行的三大框架,了解下架構的前世今生,以及我對於這些框架的一些認識和看法。

三大框架區別

MVC

  • 架構介紹

Model:數據模型,比如我們從數據庫或者網絡獲取數據
View:視圖,也就是我們的xml布局文件
Controller:控制器,也就是我們的Activity

  • 模型聯系

View --> Controller,也就是反應View的一些用戶事件(點擊觸摸事件)到Activity上。
Controller --> Model, 也就是Activity去讀寫一些我們需要的數據。
Controller --> View, 也就是Activity在獲取數據之后,將更新內容反映到View上。

這樣一個完整的項目架構就出來了,也是我們早期進行開發比較常用的項目架構。

  • 優缺點

這種缺點還是比較明顯的,主要表現就是我們的Activity太重了,經常一寫就是幾百上千行了。
造成這種問題的原因就是Controller層和View層的關系太過緊密,也就是Activity中有太多操作View的代碼了。

但是!但是!我覺得Android這種默認的開發結構稱不上傳統的MVC結構,因為Activity又可以叫View層又可以叫Controller層,所以細說的話根本就分不出來層級,只是做了一些封裝,然后Activity承載了所有。
當然這是我個人看法,可以都來討論下。

MVP

  • 架構介紹

之前不就是因為Activity中有操作view,又做Controller工作嗎。
所以其實MVP架構就是從原來的Activity層把viewController區分開,單獨抽出來一層Presenter作為原來Controller的職位。
然后最后演化成,將View層寫成接口的形式,然后Activity去實現View接口,最后在Presenter類中去實現方法。

Model:數據模型,比如我們從數據庫或者網絡獲取數據。
View:視圖,也就是我們的xml布局文件和Activity。
Presenter:主持人,單獨的類,只做調度工作。

  • 模型聯系

View --> Presenter,反應View的一些用戶事件到Presenter上。
Presenter --> Model, Presenter去讀寫操作一些我們需要的數據。
Controller --> View, Presenter在獲取數據之后,將更新內容反饋給Activity,進行view更新。

  • 優缺點

這種的優點就是確實大大減少了Activity的負擔,讓Activity主要承擔一個更新View的工作,然后把跟Model交互的工作轉移給了Presenter,從而由Presenter方來控制和交互Model方以及View方。所以讓項目更加明確簡單,順序性思維開發。

缺點也很明顯:
首先就是代碼量大大增加了,每個頁面或者說功能點,都要專門寫一個Presenter類,並且由於是面向接口編程,需要增加大量接口,會有大量繁瑣的回調。
其次,由於Presenter里持有了Activity對象,所以可能會導致內存泄漏或者view空指針,這也是需要注意的地方。

MVVM

  • 架構介紹

MVVM的特點就是雙向綁定,並且有Google官方加持,更新了Jetpack中很多架構組件,比如ViewModel,Livedata,DataBinding等等,所以這個是現在的主流框架和官方推崇的框架。

Model:數據模型,比如我們從數據庫或者網絡獲取數據。
View:視圖,也就是我們的xml布局文件和Activity。
ViewModel:關聯層,將Model和View綁定,使他們之間可以相互綁定實時更新

  • 模型聯系

View --> ViewModel -->View,雙向綁定,數據改動可以反映到界面,界面的修改可以反映到數據。
ViewModel --> Model, 操作一些我們需要的數據。

  • 優缺點

優點就是官方大力支持,所以也更新了很多相關庫,讓MVVM架構更強更好用,而且雙向綁定的特點可以讓我們省去很多View和Model的交互。也基本解決了上面兩個架構的問題。

說說我理解的MVVM

先說說MVVM是怎么解決了其他兩個架構所在的缺陷和問題:

  • 解決了各個層級之間耦合度太高的問題,也就是更好的完成了解耦。MVP層中,Presenter還是會持有View的引用,但是在MVVM中,View和Model進行雙向綁定,從而使viewModel基本只需要處理業務邏輯,無需關系界面相關的元素了。

  • 解決了代碼量太多,或者模式化代碼太多的問題。由於雙向綁定,所以UI相關的代碼就少了很多,這也是代碼量少的關鍵。而這其中起到比較關鍵的組件就是DataBinding,使所有的UI變動都交給了被觀察的數據模型。

  • 解決了可能會有的內存泄漏問題。MVVM架構組件中有一個組件是LiveData,它具有生命周期感知能力,可以感知到Activity等的生命周期,所以就可以在其關聯的生命周期遭到銷毀后自行清理,就大大減少了內存泄漏問題。

  • 解決了因為Activity停止而導致的View空指針問題。在MVVM中使用了LiveData,那么在需要更新View的時候,如果觀察者的生命周期處於非活躍狀態(如返回棧中的 Activity),則它不會接收任何 LiveData 事件。也就是他會保證在界面可見的時候才會進行響應,這樣就解決了空指針問題。

  • 解決了生命周期管理問題。這主要得益於Lifecycle組件,它使得一些控件可以對生命周期進行觀察,就能隨時隨地進行生命周期事件。

再說說響應式編程

響應式編程,說白了就是我先構建好事物之間的關系,然后就可以不用管了。他們之間會因為這層關系而互相驅動。
其實也就是我們常說的觀察者模式,或者說訂閱發布模式。

為什么說這個呢,因為MVVM的本質思想就是類似這種。不管是雙向綁定,還是生命周期感知,其實都是一種觀察者模式,使所有事物變得可觀察,那么我們只需要把這種觀察關系給穩定住,那么項目也就穩健了。

最后再說說MVVM為什么這么強大?

我個人覺得,MVVM強大不是因為這個架構本身,而是因為這種響應式編程的優勢比較大,再加上Google官方的大力支持,出了這么多支持的組件,來維系MVVM架構,其實也是官方想進行項目架構的統一。

優秀的架構思想+官方支持=強大

拜拜

有一起學習的小伙伴可以關注下❤️我的公眾號——碼上積木,每天三問面試真題,詳細剖析,助你成為offer收割機。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM