JetPack之MVVM模式最詳細和精煉的介紹及解析

引言

??第一個簡單的問題:請問MVC模式是設計模式嗎缚柏?答案:不是。如果你對設計模式和架構模式還有認識上的誤區(qū)元暴,那你就要警惕了匈挖!
??第二個簡單的問題:請問你在什么時候使用到MVC模式?是在Java開發(fā)后臺的時候思灰?還是在前端開發(fā)玷犹,比如Android開發(fā)?
??第三個簡單的問題:在使用MVC模式從事開發(fā)的過程中洒疚,你有沒有發(fā)現(xiàn)它這個模式本身有什么局限性歹颓,或者有什么可以改進的地方?

??可以說油湖,這是靈魂三問了吧巍扛!今天我們要介紹的MVVM模式,就是MVC模式的升級版乏德,它針對MVC模式的短板進行了改進撤奸,是現(xiàn)如今Android開發(fā)過程中最常見的架構模式,今天我們就來認識它喊括。(靈魂三問的答案先賣個關子寂呛,讀完文章你就知道了)


介紹

??首先,要搞明白MVVM模式瘾晃,它是一種架構模式贷痪,有別于設計模式。這兩種是有本質區(qū)別的蹦误,設計模式只是為了解決一類問題而總結出的抽象方法劫拢,比如單例模式,就是防止對象被多次實例化强胰;而架構模式往往能使用多種設計模式舱沧。

??MVVM是Model-View-ViewModel的簡寫,MVVM模式實現(xiàn)了數(shù)據(jù)視圖的綁定(DataBinding)偶洋,當數(shù)據(jù)變化時熟吏,視圖會自動更新;反之玄窝,當視圖發(fā)生改變時牵寺,數(shù)據(jù)也會自動更新。

??說人話恩脂?來設想一下帽氓,比如你要調用接口獲取數(shù)據(jù),進而在視圖中展示給用戶俩块,那如果出現(xiàn)了這種情況黎休,數(shù)據(jù)改變了呢浓领?你是不是在想重新請求下接口數(shù)據(jù),再獲取到就OK了啊势腮,重新請求接口是沒錯联贩,但拿到的數(shù)據(jù),怎么更新捎拯?還需要繁瑣地設置各種填充數(shù)據(jù)流吧撑蒜?這就是MVC的設計思路,而MVVM所做的事情玄渗,就是簡化其將數(shù)據(jù)轉化為視圖的過程Wぁ(再不懂就沒道理了啊L偈鳌)


解析

何為MVVM模式浴滴?介紹的太皮毛了!

拆分來看:Model+View+ViewModel
對比MVC:Model+View+Controller
??看出區(qū)別了嗎岁钓?Model+View兩者都一樣有升略,無非是數(shù)據(jù)保存和用戶界面,它們最大的區(qū)別就在于M與V的交互方式不同屡限,MVC模式采用Controller來處理業(yè)務邏輯品嚣,而MVVM則采用ViewModel來處理。

具體來說:

對比MVC模式:
??用戶操作> View (負責接受用戶的輸入操作)>Controller(業(yè)務邏輯處理)>Model(數(shù)據(jù)持久化)>View(將結果通過View反饋給用戶)钧大。
??先不說其他翰撑,請問把所有的業(yè)務邏輯都交給Controller來進行會出現(xiàn)什么問題?
1.所有業(yè)務邏輯都在Controller里操作啊央,邏輯復雜且不利于維護眶诈。
2.大量的DOM 操作使頁面渲染性能降低,加載速度變慢瓜饥,影響用戶體驗逝撬。
3.當 Model 頻繁發(fā)生變化,需要主動更新到View乓土;當用戶的操作導致Model發(fā)生變化宪潮,同樣需要將變化的數(shù)據(jù)同步到Model中, 這樣的工作不僅繁瑣趣苏,而且很難維護復雜多變的數(shù)據(jù)狀態(tài)狡相。

于是MVVM出現(xiàn)了,它來了它來了拦键,它帶著自動更新走來了谣光!

??ViewModel 是一個同步View 和 Model的對象檩淋。View 和 Model 之間并沒有直接的聯(lián)系芬为,而是通過ViewModel進行交互萄金。ViewModel 通過雙向數(shù)據(jù)綁定把 View 層和 Model 層連接了起來,而View 和 Model 之間的同步工作完全是自動的媚朦,無需人為干涉氧敢,因此開發(fā)者只需關注業(yè)務邏輯,不需要手動操作DOM, 不需要關注數(shù)據(jù)狀態(tài)的同步問題询张,復雜的數(shù)據(jù)狀態(tài)維護完全由 MVVM 來統(tǒng)一管理孙乖。

??數(shù)據(jù)視圖雙向綁定VM雙向綁定:在 MVVM 框架中,View(視圖) 和 Model(數(shù)據(jù)) 是不可以直接通訊的份氧,在它們之間存在著 ViewModel 這個中間介充當著觀察者的角色唯袄。當用戶操作 View(視圖),ViewModel 感知到變化蜗帜,然后通知 Model 發(fā)生相應改變恋拷;反之當 Model(數(shù)據(jù)) 發(fā)生改變,ViewModel 也能感知到變化厅缺,使 View 作出相應更新蔬顾。這個一來一回的過程就是我們所熟知的雙向綁定。而這一切就需要大師兄DataBinding(JetPack中的一個成員湘捎,進行數(shù)據(jù)綁定)來實現(xiàn)诀豁。

操作步驟:

(1)提供View,ViewModel以及Model三層窥妇;
(2)將布局修改為DataBinding布局舷胜;
(3)View與ViewModel之間通過DataBinding進行通信;
(4)獲取數(shù)據(jù)并展示在界面上活翩。

優(yōu)缺點

優(yōu)點:

1.簡化了界面與業(yè)務的依賴性逞带,也解決了數(shù)據(jù)的頻繁更新的問題。
2.實現(xiàn)了數(shù)據(jù)和視圖的雙向綁定纱新,極大地簡化了代碼展氓。
3.減少了接口數(shù)量;
4.告別了繁瑣findViewById操作脸爱;

缺點:

bug難以調試遇汞,并且DataBinding目前還存在一些編譯問題。

總結:

??要學好MVVM模式簿废,需要先學習了解DataBinding和LiveData空入。
DataBinding是MVVM數(shù)據(jù)綁定的工具。
??LiveData可以更好的解決MVVM之間的通信問題族檬,并且它可以更好地感知組件的生命周期歪赢,能夠有效地避免內存泄漏。

閑話

??在我的印象中单料,MVVM模式埋凯,就是一個取經團隊点楼,其中DataBinding是大師兄悟空,LiveData是二師兄悟能白对,Lifecycle則是三師弟悟凈掠廓。
??DataBinding(大師兄)負責將肉眼可見的所有視圖精怪都整理好,交由ViewModel(玄奘)來處理業(yè)務邏輯甩恼,但看過大話西游的都知道蟀瞧,悟空好斗,而玄奘良善条摸,二者不可溝通悦污,這就需要LiveData(二師兄)來進行溝通兩者了,事實上LiveData就是為了解決DataBinding與ViewModel之間的通信問題而出現(xiàn)的钉蒲,ViewModel調用接口獲取數(shù)據(jù)(如來給它的)塞关,LiveData負責通知DataBinding,師傅要你更新視圖子巾,因為數(shù)據(jù)更改了帆赢,而Lifecycle(悟凈)一直默默支持著大師兄,二師兄线梗,以及師傅椰于。

Tips

??第一:MVVM模式中的DataBinding是非必須的。也就是說可以不用DataBinding實現(xiàn)MVVM模式仪搔。
??第二:ViewModel配合LiveData更新數(shù)據(jù)瘾婿,只是它作為輔助的功能,它最主要的功能是共享數(shù)據(jù)烤咧。在Activity和Fragment復用同一個ViewModel時偏陪,Activity中的數(shù)據(jù)更改后,F(xiàn)ragment無需任何多余操作煮嫌,可以自動更新數(shù)據(jù)笛谦。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昌阿,隨后出現(xiàn)的幾起案子饥脑,更是在濱河造成了極大的恐慌,老刑警劉巖懦冰,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灶轰,死亡現(xiàn)場離奇詭異,居然都是意外死亡刷钢,警方通過查閱死者的電腦和手機笋颤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來内地,“玉大人伴澄,你說我怎么就攤上這事赋除。” “怎么了秉版?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵贤重,是天一觀的道長茬祷。 經常有香客問我清焕,道長,這世上最難降的妖魔是什么祭犯? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任秸妥,我火速辦了婚禮,結果婚禮上沃粗,老公的妹妹穿的比我還像新娘粥惧。我一直安慰自己,他們只是感情好最盅,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布突雪。 她就那樣靜靜地躺著,像睡著了一般涡贱。 火紅的嫁衣襯著肌膚如雪咏删。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天问词,我揣著相機與錄音督函,去河邊找鬼。 笑死激挪,一個胖子當著我的面吹牛辰狡,可吹牛的內容都是我干的。 我是一名探鬼主播垄分,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼宛篇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了薄湿?” 一聲冷哼從身側響起些己,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘿般,沒想到半個月后段标,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡炉奴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年逼庞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞻赶。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赛糟,死狀恐怖派任,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情璧南,我是刑警寧澤掌逛,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站司倚,受9級特大地震影響豆混,放射性物質發(fā)生泄漏。R本人自食惡果不足惜动知,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一皿伺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒粮,春花似錦鸵鸥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矢渊。三九已至呻待,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汁讼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓阔墩,卻偏偏與公主長得像嘿架,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啸箫,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容