????????很多人不愿意寫關(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)化埠褪。
????????先來看看大部分人寫法看下圖:
????????然后我們看下跑出來效果:
然后我們用內(nèi)存分析工具浓利,我們拍一張內(nèi)存照片,然后在GC一下钞速,我們看看會發(fā)生什么:
如果看不懂這個圖的贷掖,可以自己去學習一下∮窆ぃ看出了什么沒有羽资,
兩張圖對比淘菩,本來GC完這個activity會回收的遵班,然而現(xiàn)實并沒有。現(xiàn)在我們來改代碼潮改,改成MVP的模式狭郑,百度上已經(jīng)基礎(chǔ)的教我們怎么寫了,我們直接寫汇在,我以下截圖都是類跟接口翰萨,然后上截圖。(接口跟類起名比較隨意糕殉,只是例子亩鬼,實際中都有規(guī)范)
這個就是View層殖告,只要是做回調(diào)把數(shù)據(jù)回調(diào)給activity
model層接口,很多人直接寫void loadDate(ListModelBean listModelBean)雳锋;這個是不對的黄绩,因為我們的數(shù)據(jù)大多數(shù)是從服務(wù)器來的,所以只要加載速度過長那就會直接卡在這里玷过,所以我們創(chuàng)建內(nèi)部接口進行回調(diào)
model類爽丹,所有的數(shù)據(jù)邏輯都是在這個地方處理,繼承ITaskModel接口把數(shù)據(jù)傳遞進去辛蚊,此時我們完成了M層和V層粤蝎,現(xiàn)在就差P層,這個時候我們可以一個形象的比喻袋马,P是身體初澎,M層跟V層是左右手。是不是很像飞蛹。下面我們來創(chuàng)建P層
P 層第一我們肯定先寫出兩個接口(左右手)ITaskview盼理,ITaskModel,然后構(gòu)造函數(shù)祭犯,然后初始化忱辅,有沒有發(fā)現(xiàn)我們的初始化跟百度的很多不一樣,這里有人問為什么要用泛型霉囚,這里好處很多安蹲小!大家可以自己體會下盈罐,我就不講好處榜跌,思考使我們必須具備的能力。現(xiàn)在直接在P層執(zhí)行UI邏輯盅粪,并且通過view層回調(diào)給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)存泄漏問題×敬玻看下圖:
看到改了什么沒有沃但,我們注銷ITaskview,然后用弱引用的方式佛吓,這樣內(nèi)存在不足的時候GC就回收宵晚。運行效果看看,我們主要看內(nèi)存维雇,這個我想大家會在控制臺看變化淤刃。當然我們這個還沒做完,而且也不是最好的辦法吱型,這個時候我們咋辦呢逸贾?很簡單,綁定跟解綁津滞,有沒有很熟悉铝侵。繼續(xù)P層:
我們把構(gòu)造函數(shù)里面做的事情放在綁定和解綁里面。
調(diào)用綁定和解綁触徐,這樣只要銷毀activity咪鲜,GC就會回收。現(xiàn)在我們MVP算是完成了撞鹉,但是我們P層會特別多疟丙,我們怎么優(yōu)化?所以我們我們就需要各種創(chuàng)建基類鸟雏。下面我們來操作:
把綁定解綁直接放在基類里面
繼承基類享郊,并去掉公共方法。
繼承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)在寫到這樣吧病往!贈人玫瑰捣染,手有余香。哈哈停巷!一個愛程序的加班狗液斜。