引言
Android框架的發(fā)展的過程就是一個不斷化繁為簡的過程,大家都在研究如何正確方便高效的規(guī)范代碼瞄沙。當(dāng)然這條路也永遠(yuǎn)不會停止己沛,就像新的芽兒,隨著時間的流逝距境,每天都在長出新的枝葉申尼,每天都在成長。對于技術(shù)垫桂,每次新框架的提出都在剔除舊框架的詬病和痛點(diǎn)师幕,演變成更方便,更高效诬滩,更簡潔的新框架霹粥,然后新的框架在具體使用中又會帶來新的詬病和痛點(diǎn),反反復(fù)復(fù)碱呼,無窮盡也......從開始使用MVC到使用MVP,從MVP到MVVM,每次框架的提出都有讓我們眼前一亮的東西蒙挑,但具體使用中確還是存在很多的痛點(diǎn)宗侦,似乎一直存在一種反作用力來阻止我這樣做愚臀。但又能怎樣?新的芽兒注定會長成參天大樹矾利,技術(shù)終究只會進(jìn)步姑裂。
咳咳,上面的雞湯你們喝起來可能無味男旗,但對于自己經(jīng)歷了這么多框架的迭代后舶斧,結(jié)合自己親身的體會,那味道絕對濃厚察皇。廢話不再多說茴厉,開啟今天的精彩內(nèi)容泽台。
概述
MVC
MVC這里就不多說了,大家都熟悉的不能再熟悉了矾缓,比較古老的框架了怀酷,相信大家也都使用過;
MVC具體使用
Model:數(shù)據(jù)模型嗜闻,JavaBean
View:layout布局文件
Control:Activity蜕依,處理數(shù)據(jù)請求,業(yè)務(wù)邏輯
MVC的詬病
view和control耦合嚴(yán)重琉雳,activity中存在大量的邏輯代碼样眠,activity既是view,又是control翠肘,結(jié)構(gòu)不清晰檐束,activity中內(nèi)容太多
MVP
MVP是在MVC的基礎(chǔ)上把Control獨(dú)立出來的模型,簡化Control的內(nèi)容锯茄,這里presenter充當(dāng)中間代理的角色厢塘,view和model不直接交互,而是通過presenter
MVP的具體使用
Model:實體模型肌幽,javabean
View:Activity和layout
Presenter:View和Model通過presenter交互
MVP的詬病
粒度很難把握晚碾,使用過MVP的都知道,MVP模型需要定義比較多的接口喂急,view需要定義接口格嘁,presenter需要定義接口,以前我們使用一個activty能解決的問題廊移,現(xiàn)在要將一個activity分解成一個View糕簿,一個Preseter,一個Model狡孔,每個模塊都需要使用接口來實現(xiàn)解耦懂诗,這樣就會導(dǎo)致有時候一個activity中涉及的業(yè)務(wù)比較多,按每個業(yè)務(wù)點(diǎn)搭建MVP模型的話苗膝,會導(dǎo)致原來一個activity類能搞定的殃恒,現(xiàn)在需要擴(kuò)展成多個接口,多個類才能實現(xiàn)辱揭;粒度大的話离唐,可能結(jié)構(gòu)不清晰;粒度小的話问窃,代碼量又會比較大亥鬓;
MVP是以UI和事件為驅(qū)動的模型,數(shù)據(jù)的獲取是被動的根據(jù)UI變動的域庇,我們更希望是數(shù)據(jù)變化去更新UI嵌戈,而不是反過來覆积;
Presenter和View耦合度比較高;
Presenter類在業(yè)務(wù)比較復(fù)雜情況下熟呛,代碼量比較大技健;
MVVM
MVVM是在MVP的基礎(chǔ)上,根據(jù)谷歌提出的DateBinding方案重新設(shè)計的一個靈活高效的框架惰拱,MVVM使用ViewModel一層代替原來的Presenter層;
MVVM的使用
Model:數(shù)據(jù)模型雌贱,javaBean
View:Activty和layout
ViewModel:View和Model業(yè)務(wù)邏輯交互
MVVM的優(yōu)點(diǎn)
數(shù)據(jù)驅(qū)動
在MVVM中,數(shù)據(jù)的變化可以自動更新view偿短,不需要獲取view的引用欣孤;
耦合較低
MVP模式中View和Presenter是強(qiáng)耦合的,Presenter需要拿到View的引用昔逗,這樣當(dāng)View變動時降传,Presenter也需要變化,耦合度太高勾怒;現(xiàn)在MVVM中婆排,ViewModel只負(fù)責(zé)數(shù)據(jù)和業(yè)務(wù),View的變化笔链,ViewModel不需要關(guān)系段只,數(shù)據(jù)變化,View自動更新鉴扫,耦合度比較低赞枕;
View更新
MVVM模型中不用考慮是否在主線程中更新UI,DateBinding會負(fù)責(zé)在主線程中更新UI的坪创,我們不用擔(dān)心線程的問題炕婶,簡單的不止一點(diǎn)點(diǎn);
可重復(fù)利用
一個ViewModel就是一個數(shù)據(jù)源莱预,可以將一個ViewModel綁定到不同的View中柠掂,就可以達(dá)到更新view目的
MVVM的詬病
MVVM由于是基于google的DataBinding框架的,而DataBinding支持的綁定view還比較少依沮,因此在使用的過程中可能會遇到某些view無法使用dateBinding的情況涯贞,這點(diǎn)也是我之前沒有使用MVVM的原因
既然存在上面的問題,國內(nèi)外的大牛已經(jīng)幫我們封裝好了一套使用dateBinding的view庫悉抵,為避免重復(fù)造輪子肩狂,我們可以將它引入到我們的項目中直接使用摘完,目前我知道的已經(jīng)支持常用所有view姥饰;
總結(jié)
經(jīng)過上面對不同框架的對比,相信大家都有一個基本的了解孝治,有人會問這么多框架列粪,我們使用那個比較好呢审磁?
個人覺得,技術(shù)是在不斷進(jìn)步岂座,舊的框架最終都會被新的框架所代替态蒂,我覺得MVVM的提出解決了我們使用其他框架的很多痛點(diǎn),我覺得使用MVVM會更好點(diǎn)费什。
MVVM如何使用
篇幅原因钾恢,下一篇文章將為大家詳細(xì)介紹如何使用MVVM框架,敬請期待鸳址;