Android逃不開的架構(gòu)模式---MVP

先來一張爸爸的照片

????????很多人不愿意寫關(guān)于Android中MVP的文章,為啥呢置吓,費時間无虚,大家更喜歡用視頻的方式,文章寫起來太浪費時間了衍锚,所以咯友题,目前也只有我這樣的離職人員有時間寫了。話說回來戴质,我們在工作中度宦,你不可能對著一個視頻教你寫代碼吧踢匣!小組長或者CTO在背后diss你,你不怕戈抄?所以來一下文章离唬,邊看邊寫,真香划鸽。還有人說這百度一大堆MVP的文章输莺,為啥要看你的。這里漾稀,我希望你看完文章你就知道為什么模闲,我現(xiàn)在寫的才是你實際可以直接用的,百度很多都是知識教你認識崭捍,也有人寫類似的文章尸折,但我們每個人的都有些不一樣,你可以集思廣益殷蛇,自己優(yōu)化实夹。先說下今天寫哪些內(nèi)容,首先粒梦,我們還是簡單的比較下MVC亮航,MVVM,MVP匀们,然后我們就開始擼代碼缴淋,最后我們就講一下MVP優(yōu)化。

????????MVC有兩個很明顯的問題:

1.m層和v層直接打交道泄朴,導(dǎo)致這兩層耦合度高

2.因為所有邏輯都寫在c層重抖,導(dǎo)致c層特別臃腫

????????我相信很多Android的開發(fā)工程師都還在用MVC模式,我自己的同學祖灰,包括前同事等钟沛,目前都在用,問他們?yōu)樯毒址觯卮鸲际呛唵魏尥常椖恐芷诰o,沒時間三妈,MVP接口多畜埋,寫起來麻煩,所以直接懟代碼畴蒲。(如果是做服務(wù)端的人肯定奇怪為啥Android居然可以用MVC寫的下去)由捎,實際上MVP眾多的缺點都是可以用代碼解決的。

????????MVP:

p層代替了了c層饿凛,v層和m層的交互被p層隔斷狞玛,從理論上去除了v和m層的耦合软驰。

但是造成p層比原來的c層更加臃腫,為了緩解這種臃腫心肪,MVVM出現(xiàn)了

????????MVVM:

簡單的來說MVVM其實就是MVP中把P層削弱為VM層锭亏,部分簡單的邏輯職責分給了View層。但是有一個很大的問題硬鞍,也是至今這個模式比MVP模式用的少太多的原因慧瘤,那就是占用內(nèi)存,比方說固该,如果你用MVP開發(fā)的app只是占用1G的內(nèi)存的話锅减,那MVVM差不多就要占用2.5G。至于為什么伐坏,那一講又是一內(nèi)容怔匣,本來今天講的就會很多。所以有興趣的同學自己去學習桦沉。

????????好了每瞒,現(xiàn)在我們來擼項目,用項目說話纯露,更直觀剿骨,我們首先來百度一大堆的那個教程先寫一遍,然后我們來優(yōu)化埠褪。

????????先來看看大部分人寫法看下圖:

一個簡單的recycler加載數(shù)據(jù)

????????然后我們看下跑出來效果:

跑出來的效果

然后我們用內(nèi)存分析工具浓利,我們拍一張內(nèi)存照片,然后在GC一下钞速,我們看看會發(fā)生什么:

內(nèi)存快照GC前

如果看不懂這個圖的贷掖,可以自己去學習一下∮窆ぃ看出了什么沒有羽资,

GC后

兩張圖對比淘菩,本來GC完這個activity會回收的遵班,然而現(xiàn)實并沒有。現(xiàn)在我們來改代碼潮改,改成MVP的模式狭郑,百度上已經(jīng)基礎(chǔ)的教我們怎么寫了,我們直接寫汇在,我以下截圖都是類跟接口翰萨,然后上截圖。(接口跟類起名比較隨意糕殉,只是例子亩鬼,實際中都有規(guī)范)

首先創(chuàng)建ivew接口

這個就是View層殖告,只要是做回調(diào)把數(shù)據(jù)回調(diào)給activity

創(chuàng)建model層接口

model層接口,很多人直接寫void loadDate(ListModelBean listModelBean)雳锋;這個是不對的黄绩,因為我們的數(shù)據(jù)大多數(shù)是從服務(wù)器來的,所以只要加載速度過長那就會直接卡在這里玷过,所以我們創(chuàng)建內(nèi)部接口進行回調(diào)

創(chuàng)建model類

model類爽丹,所有的數(shù)據(jù)邏輯都是在這個地方處理,繼承ITaskModel接口把數(shù)據(jù)傳遞進去辛蚊,此時我們完成了M層和V層粤蝎,現(xiàn)在就差P層,這個時候我們可以一個形象的比喻袋马,P是身體初澎,M層跟V層是左右手。是不是很像飞蛹。下面我們來創(chuàng)建P層

創(chuàng)建的P層

P 層第一我們肯定先寫出兩個接口(左右手)ITaskview盼理,ITaskModel,然后構(gòu)造函數(shù)祭犯,然后初始化忱辅,有沒有發(fā)現(xiàn)我們的初始化跟百度的很多不一樣,這里有人問為什么要用泛型霉囚,這里好處很多安蹲小!大家可以自己體會下盈罐,我就不講好處榜跌,思考使我們必須具備的能力。現(xiàn)在直接在P層執(zhí)行UI邏輯盅粪,并且通過view層回調(diào)給activity

Activity

activity里面代碼是不是少很多钓葫,像加載數(shù)據(jù)之類的跟activity全部給了model。這是基本的MVP票顾,大家執(zhí)行下效果〈「。現(xiàn)在我們并不是大功告成,大家想想奠骄,如果數(shù)據(jù)不能及時回收怎么辦豆同?內(nèi)存泄漏怎么辦?還有我們的MVP會創(chuàng)建那么多接口含鳞,看著就麻煩怎么辦影锈?這個是可以通過代碼解決的,這也是研究一點跟只會基礎(chǔ)掌握的區(qū)別。下面我們開始優(yōu)化代碼鸭廷,我們目光轉(zhuǎn)移到P層枣抱,然后我們把數(shù)據(jù)弱引用來解決內(nèi)存泄漏問題×敬玻看下圖:

修改后的p層

看到改了什么沒有沃但,我們注銷ITaskview,然后用弱引用的方式佛吓,這樣內(nèi)存在不足的時候GC就回收宵晚。運行效果看看,我們主要看內(nèi)存维雇,這個我想大家會在控制臺看變化淤刃。當然我們這個還沒做完,而且也不是最好的辦法吱型,這個時候我們咋辦呢逸贾?很簡單,綁定跟解綁津滞,有沒有很熟悉铝侵。繼續(xù)P層:

再次修改過的P層

我們把構(gòu)造函數(shù)里面做的事情放在綁定和解綁里面。

activity里面修改

調(diào)用綁定和解綁触徐,這樣只要銷毀activity咪鲜,GC就會回收。現(xiàn)在我們MVP算是完成了撞鹉,但是我們P層會特別多疟丙,我們怎么優(yōu)化?所以我們我們就需要各種創(chuàng)建基類鸟雏。下面我們來操作:

創(chuàng)建present基類

把綁定解綁直接放在基類里面

修改的Taskpersent

繼承基類享郊,并去掉公共方法。

創(chuàng)建BaseActivity來進行P層的綁定跟解綁

修改后的activity

繼承BaseActivity然后去除那些綁定解綁之類的公共方法⌒⑷担現(xiàn)在我們基本上完善了MVP的優(yōu)化炊琉,大家可以有一個小測試,那就是我們直接修改xml里面的View(RecyclerView或者listView)更換成GridView,看看是不是有一個小驚喜∮只睿現(xiàn)在我們優(yōu)化了activity的內(nèi)存泄露苔咪。講了這么多,真的特別累人皇钞,不過現(xiàn)在還有問題悼泌,我們?nèi)绾蝺?yōu)化model層呢松捉?model是比較麻煩的夹界,先看看實際開發(fā)中我們遇到的基本是這幾個問題:

無法對所有Model統(tǒng)一管理。

每個Model對外提供的獲取數(shù)據(jù)方法不一樣,上層請求數(shù)據(jù)沒有規(guī)范可柿。

代碼冗余高鸠踪,網(wǎng)絡(luò)數(shù)據(jù)請求除URL和參數(shù)外其他大概都一樣的。

對已存在的Model管理困難复斥,不能直觀的統(tǒng)計已存在的Model营密。

model層我們優(yōu)化就一句話,單獨封裝目锭,集中管理或者我們弄一個事件總線RXBus(推薦)來調(diào)度评汰。是不是一說就很簡單了?一看時間又花了三小時了痢虹,整理這篇文章已經(jīng)超過四個小時了被去,下次再說如何優(yōu)化model層。最后心疼一下程序員奖唯,唉~分享使我快樂惨缆,MVP我只是在這個地方提供這么一個思路,優(yōu)化的路還很長丰捷,里面細節(jié)問題坯墨,歡迎自己思考,現(xiàn)在寫到這樣吧病往!贈人玫瑰捣染,手有余香。哈哈停巷!一個愛程序的加班狗液斜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叠穆,隨后出現(xiàn)的幾起案子少漆,更是在濱河造成了極大的恐慌,老刑警劉巖硼被,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件示损,死亡現(xiàn)場離奇詭異,居然都是意外死亡嚷硫,警方通過查閱死者的電腦和手機检访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仔掸,“玉大人脆贵,你說我怎么就攤上這事∑鹉海” “怎么了卖氨?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我筒捺,道長柏腻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任系吭,我火速辦了婚禮五嫂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肯尺。我一直安慰自己沃缘,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布则吟。 她就那樣靜靜地躺著孩灯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逾滥。 梳的紋絲不亂的頭發(fā)上峰档,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音寨昙,去河邊找鬼讥巡。 笑死,一個胖子當著我的面吹牛舔哪,可吹牛的內(nèi)容都是我干的欢顷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼捉蚤,長吁一口氣:“原來是場噩夢啊……” “哼抬驴!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起缆巧,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤布持,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陕悬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體题暖,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年捉超,在試婚紗的時候發(fā)現(xiàn)自己被綠了胧卤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拼岳,死狀恐怖枝誊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惜纸,我是刑警寧澤叶撒,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布绝骚,位于F島的核電站,受9級特大地震影響痊乾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椭更,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一哪审、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虑瀑,春花似錦湿滓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痛侍,卻和暖如春朝氓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背主届。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工赵哲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人君丁。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓枫夺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绘闷。 傳聞我的和親對象是個殘疾皇子橡庞,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容