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

嗨募谎,大家好扶关,今天出了大太陽,真是美好的開始数冬。
這篇文章和大家說說Android屆流行的三大框架节槐,了解下架構(gòu)的前世今生,以及我對于這些框架的一些認識和看法拐纱。

三大框架區(qū)別

MVC

  • 架構(gòu)介紹

Model:數(shù)據(jù)模型铜异,比如我們從數(shù)據(jù)庫或者網(wǎng)絡(luò)獲取數(shù)據(jù)
View:視圖,也就是我們的xml布局文件
Controller:控制器秸架,也就是我們的Activity

  • 模型聯(lián)系

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

這樣一個完整的項目架構(gòu)就出來了府阀,也是我們早期進行開發(fā)比較常用的項目架構(gòu)。

  • 優(yōu)缺點

這種缺點還是比較明顯的芽突,主要表現(xiàn)就是我們的Activity太重了试浙,經(jīng)常一寫就是幾百上千行了。
造成這種問題的原因就是Controller層和View層的關(guān)系太過緊密寞蚌,也就是Activity中有太多操作View的代碼了田巴。

但是钠糊!但是!我覺得Android這種默認的開發(fā)結(jié)構(gòu)稱不上傳統(tǒng)的MVC結(jié)構(gòu)壹哺,因為Activity又可以叫View層又可以叫Controller層抄伍,所以細說的話根本就分不出來層級,只是做了一些封裝管宵,然后Activity承載了所有截珍。
當然這是我個人看法,可以都來討論下箩朴。

MVP

  • 架構(gòu)介紹

之前不就是因為Activity中有操作view岗喉,又做Controller工作嗎。
所以其實MVP架構(gòu)就是從原來的Activity層把viewController區(qū)分開炸庞,單獨抽出來一層Presenter作為原來Controller的職位钱床。
然后最后演化成,將View層寫成接口的形式埠居,然后Activity去實現(xiàn)View接口查牌,最后在Presenter類中去實現(xiàn)方法。

Model:數(shù)據(jù)模型拐格,比如我們從數(shù)據(jù)庫或者網(wǎng)絡(luò)獲取數(shù)據(jù)僧免。
View:視圖,也就是我們的xml布局文件和Activity捏浊。
Presenter:主持人懂衩,單獨的類,只做調(diào)度工作金踪。

  • 模型聯(lián)系

View --> Presenter浊洞,反應View的一些用戶事件到Presenter上。
Presenter --> Model, Presenter去讀寫操作一些我們需要的數(shù)據(jù)胡岔。
Controller --> View, Presenter在獲取數(shù)據(jù)之后法希,將更新內(nèi)容反饋給Activity,進行view更新靶瘸。

  • 優(yōu)缺點

這種的優(yōu)點就是確實大大減少了Activity的負擔苫亦,讓Activity主要承擔一個更新View的工作,然后把跟Model交互的工作轉(zhuǎn)移給了Presenter怨咪,從而由Presenter方來控制和交互Model方以及View方屋剑。所以讓項目更加明確簡單,順序性思維開發(fā)诗眨。

缺點也很明顯:
首先就是代碼量大大增加了唉匾,每個頁面或者說功能點,都要專門寫一個Presenter類匠楚,并且由于是面向接口編程巍膘,需要增加大量接口厂财,會有大量繁瑣的回調(diào)。
其次峡懈,由于Presenter里持有了Activity對象璃饱,所以可能會導致內(nèi)存泄漏或者view空指針,這也是需要注意的地方逮诲。

MVVM

  • 架構(gòu)介紹

MVVM的特點就是雙向綁定帜平,并且有Google官方加持,更新了Jetpack中很多架構(gòu)組件梅鹦,比如ViewModel裆甩,Livedata,DataBinding等等齐唆,所以這個是現(xiàn)在的主流框架和官方推崇的框架嗤栓。

Model:數(shù)據(jù)模型,比如我們從數(shù)據(jù)庫或者網(wǎng)絡(luò)獲取數(shù)據(jù)箍邮。
View:視圖茉帅,也就是我們的xml布局文件和Activity。
ViewModel:關(guān)聯(lián)層锭弊,將Model和View綁定堪澎,使他們之間可以相互綁定實時更新

  • 模型聯(lián)系

View --> ViewModel -->View,雙向綁定味滞,數(shù)據(jù)改動可以反映到界面樱蛤,界面的修改可以反映到數(shù)據(jù)。
ViewModel --> Model, 操作一些我們需要的數(shù)據(jù)剑鞍。

  • 優(yōu)缺點

優(yōu)點就是官方大力支持昨凡,所以也更新了很多相關(guān)庫,讓MVVM架構(gòu)更強更好用蚁署,而且雙向綁定的特點可以讓我們省去很多View和Model的交互便脊。也基本解決了上面兩個架構(gòu)的問題。

說說我理解的MVVM

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

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

  • 解決了代碼量太多送讲,或者模式化代碼太多的問題奸笤。由于雙向綁定惋啃,所以UI相關(guān)的代碼就少了很多,這也是代碼量少的關(guān)鍵监右。而這其中起到比較關(guān)鍵的組件就是DataBinding边灭,使所有的UI變動都交給了被觀察的數(shù)據(jù)模型。

  • 解決了可能會有的內(nèi)存泄漏問題健盒。MVVM架構(gòu)組件中有一個組件是LiveData绒瘦,它具有生命周期感知能力,可以感知到Activity等的生命周期扣癣,所以就可以在其關(guān)聯(lián)的生命周期遭到銷毀后自行清理惰帽,就大大減少了內(nèi)存泄漏問題。

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

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

再說說響應式編程

響應式編程,說白了就是我先構(gòu)建好事物之間的關(guān)系赚窃,然后就可以不用管了册招。他們之間會因為這層關(guān)系而互相驅(qū)動。
其實也就是我們常說的觀察者模式勒极,或者說訂閱發(fā)布模式是掰。

為什么說這個呢,因為MVVM的本質(zhì)思想就是類似這種辱匿。不管是雙向綁定键痛,還是生命周期感知,其實都是一種觀察者模式匾七,使所有事物變得可觀察絮短,那么我們只需要把這種觀察關(guān)系給穩(wěn)定住,那么項目也就穩(wěn)健了昨忆。

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

我個人覺得,MVVM強大不是因為這個架構(gòu)本身,而是因為這種響應式編程的優(yōu)勢比較大席里,再加上Google官方的大力支持叔磷,出了這么多支持的組件,來維系MVVM架構(gòu)奖磁,其實也是官方想進行項目架構(gòu)的統(tǒng)一改基。

優(yōu)秀的架構(gòu)思想+官方支持=強大

拜拜

有一起學習的小伙伴可以關(guān)注下?? 我的公.眾.號——碼上積木,每天三問面試真題咖为,詳細剖析秕狰,助你成為offer收割機。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末躁染,一起剝皮案震驚了整個濱河市鸣哀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褐啡,老刑警劉巖诺舔,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異备畦,居然都是意外死亡低飒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門懂盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褥赊,“玉大人,你說我怎么就攤上這事莉恼“韬恚” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵俐银,是天一觀的道長尿背。 經(jīng)常有香客問我,道長捶惜,這世上最難降的妖魔是什么田藐? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吱七,結(jié)果婚禮上汽久,老公的妹妹穿的比我還像新娘。我一直安慰自己踊餐,他們只是感情好景醇,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吝岭,像睡著了一般三痰。 火紅的嫁衣襯著肌膚如雪吧寺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天酒觅,我揣著相機與錄音撮执,去河邊找鬼。 笑死舷丹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蜓肆。 我是一名探鬼主播颜凯,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仗扬!你這毒婦竟也來了症概?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤早芭,失蹤者是張志新(化名)和其女友劉穎彼城,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體退个,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡募壕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了语盈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舱馅。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刀荒,靈堂內(nèi)的尸體忽然破棺而出代嗤,到底是詐尸還是另有隱情,我是刑警寧澤缠借,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布干毅,位于F島的核電站,受9級特大地震影響泼返,放射性物質(zhì)發(fā)生泄漏硝逢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一符隙、第九天 我趴在偏房一處隱蔽的房頂上張望趴捅。 院中可真熱鬧,春花似錦霹疫、人聲如沸拱绑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽猎拨。三九已至膀藐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間红省,已是汗流浹背额各。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吧恃,地道東北人虾啦。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像痕寓,于是被迫代替她去往敵國和親傲醉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348