簡(jiǎn)介mvp

了解mvp

任何軟件都是以數(shù)據(jù)為中心,為了能與用戶進(jìn)行交互,就需要提供界面支持用戶對(duì)數(shù)據(jù)進(jìn)行增刪改查操作。

不管是mvc,mvp還是mvvm始終都在做一件事情:怎么樣能更好的解決數(shù)據(jù)與界面之間的關(guān)系,以達(dá)到數(shù)據(jù)與界面之間的耦合更低,代碼的復(fù)用性更高,代碼的可測(cè)性更好。

mvp的結(jié)構(gòu)圖



mvp中的關(guān)系

1、mvp的分層結(jié)構(gòu)特別類似于網(wǎng)絡(luò)的七層協(xié)議,每層只知道自己依賴層的細(xì)節(jié)。

2、這種分層的好處是:層與層之間的耦合性低,模塊的復(fù)用性高,可維護(hù)性更好,每層可以單獨(dú)存在,這樣可測(cè)性更好。

3、數(shù)據(jù)流的走向可以是:view-->presenter-->model-->presenter-->view,這種數(shù)據(jù)流一般出現(xiàn)的場(chǎng)景是用戶在界面觸發(fā)了一個(gè)事件的情形下

4、數(shù)據(jù)流的走向也可以是:model-->presenter-->view,這種數(shù)據(jù)流一般出現(xiàn)于比如通過(guò)長(zhǎng)鏈接接收消息的場(chǎng)景。

5、不管數(shù)據(jù)流是怎樣的一個(gè)流動(dòng)走向,始終有一個(gè)原則是:數(shù)據(jù)流不能跨層流動(dòng),即層與層不能跨層通信。

順序依次來(lái)介紹model,presenter,view。

數(shù)據(jù)加工處理廠

通過(guò)應(yīng)用mvp后的感受,我個(gè)人的感覺(jué)model是最難寫的一層,并且也是最難懂的,因?yàn)閙odel是整個(gè)應(yīng)用或界面的數(shù)據(jù)加工處理廠,所謂數(shù)據(jù)加工廠就是對(duì)數(shù)據(jù)的獲取,數(shù)據(jù)的解析,數(shù)據(jù)的存儲(chǔ),數(shù)據(jù)的分發(fā),數(shù)據(jù)的增刪改查等操作。意思就是凡是涉及到數(shù)據(jù)操作都是在model進(jìn)行的,所以model不僅僅只是實(shí)體類的集合,同時(shí)還包含關(guān)于數(shù)據(jù)的各種處理操作。

三種數(shù)據(jù)源

數(shù)據(jù)的數(shù)據(jù)源有三種:內(nèi)存,磁盤(文件或數(shù)據(jù)庫(kù)等),網(wǎng)絡(luò)。為了提升app的性能,有必要把經(jīng)常訪問(wèn)的數(shù)據(jù)臨時(shí)存入內(nèi)存中;同時(shí)也為了提升app性能和為用戶省流量省電,有必要把數(shù)據(jù)存入磁盤中;還有的數(shù)據(jù)是有必要從網(wǎng)絡(luò)讀取的。三個(gè)數(shù)據(jù)源不一定同時(shí)存在,比如不與網(wǎng)絡(luò)交互的app,不存在網(wǎng)絡(luò)數(shù)據(jù)源。所以凡是涉及到關(guān)于數(shù)據(jù)發(fā)生于三個(gè)數(shù)據(jù)源加工處理的操作的代碼都要放在model中

model為上層提供的服務(wù)

model從黑盒的角度來(lái)看為上層(指依賴于model的層比如present)提供的服務(wù)無(wú)非就2種:model為上層提供數(shù)據(jù),model處理上層傳遞的數(shù)據(jù)

model為上層提供數(shù)據(jù)

上層會(huì)從model中去數(shù)據(jù),那model會(huì)從三數(shù)據(jù)源中取數(shù)據(jù),取的順序是

先內(nèi)存,內(nèi)存取到數(shù)據(jù)返回

其次磁盤,磁盤取到數(shù)據(jù),如有必要把數(shù)據(jù)存儲(chǔ)在內(nèi)存中,則需要進(jìn)行

存儲(chǔ),返回?cái)?shù)據(jù)

最后網(wǎng)絡(luò),網(wǎng)絡(luò)取到數(shù)據(jù),如有必要在磁盤或內(nèi)存中存儲(chǔ),則進(jìn)行存儲(chǔ),返回?cái)?shù)據(jù)

上面的取數(shù)據(jù)過(guò)程是最簡(jiǎn)單的情況,復(fù)雜些還會(huì)涉及到從內(nèi)存或磁盤中取到的數(shù)據(jù)是否過(guò)期,過(guò)期的話就應(yīng)該從網(wǎng)絡(luò)獲取。從網(wǎng)絡(luò)取得數(shù)據(jù)后需要把內(nèi)存或磁盤的數(shù)據(jù)更新。

model處理上層傳遞的數(shù)據(jù)

model接收到上層傳遞的數(shù)據(jù)后,model會(huì)依次把數(shù)據(jù)扔給三個(gè)數(shù)據(jù)源去處理,有可能三個(gè)數(shù)據(jù)源都會(huì)處理數(shù)據(jù),有可能只是其中一個(gè)處理,model會(huì)把處理的結(jié)果返回。

所以model會(huì)把解析好的數(shù)據(jù)提供給上層,上層對(duì)于數(shù)據(jù)的來(lái)源完全是透明的,上層完全不需要關(guān)心數(shù)據(jù)到底是來(lái)自內(nèi)存,還是磁盤甚至是網(wǎng)絡(luò)。同理上層只需要的把數(shù)據(jù)扔給model,上層唯一做的事情就是愉快的等待處理結(jié)果。

model中的所有操作都發(fā)生于普通線程

presenter

presenter翻譯成漢語(yǔ)的意思是主持人,提出者。從它的意思可以看出它有控制全場(chǎng)的作用。首先presenter是處于mvp的中間層,在view和model中起一個(gè)承上啟下的作用。presenter會(huì)把view交給自己的命令進(jìn)行一定的校驗(yàn)等操作交給model處理,會(huì)把model處理的結(jié)果交給view。

presenter封裝業(yè)務(wù)

presenter不僅起一個(gè)橋梁的作用,它還會(huì)把業(yè)務(wù)邏輯代碼給包攬下來(lái)。這樣就可以減輕Activity的負(fù)擔(dān)了,讓Activity全心全意做它的view工作,比如一些校驗(yàn)代碼。或者可以這樣想只要是不屬于view和model的代碼基本都可以放在presenter中。

presenter負(fù)責(zé)刷新view

mvc或以前的關(guān)于view的寫法一般都是這樣,view在接收到數(shù)據(jù)后,自己來(lái)進(jìn)行view的刷新或其他操作。但是mvp中presenter負(fù)責(zé)對(duì)view進(jìn)行刷新,比如從model獲取的數(shù)據(jù),presenter會(huì)根據(jù)獲取的數(shù)據(jù)成功與否來(lái)通知view應(yīng)該是顯示成功界面還是失敗界面。

presenter持有的線程

Android中view的操作需要在ui線程里執(zhí)行,其他耗時(shí)操作需要在普通線程執(zhí)行。presenter會(huì)持有這2種線程:ui線程,普通線程。刷新view時(shí),它切換為ui線程進(jìn)行刷新,從model取數(shù)據(jù)切換為普通線程。假如使用rxjava的話,就特別簡(jiǎn)單了關(guān)于線程切換的事情。

tip

presenter從model中獲取的數(shù)據(jù)就是解析好的數(shù)據(jù),不需要出現(xiàn)解析數(shù)據(jù)的代碼。

view

view層就很好理解了,就是用戶直接看到的界面,mvp中的view是很省心的,比如更新view,接收數(shù)據(jù)。這些操作它都不需要操心,也不需要知道數(shù)據(jù)到底來(lái)自哪里,給我啥我顯示啥就可以了。

一個(gè)view可以同時(shí)擁有多個(gè)presenter,也可以只有一個(gè)presenter。

Android中的Activity,F(xiàn)ragment在mvp中是作為view來(lái)使用的,這些Activity,F(xiàn)ragment的責(zé)任就小了,只關(guān)心界面相關(guān)的事情足矣。

各種Adapter是放在view層的。

總結(jié)

我們初步認(rèn)識(shí)了mvp,mvp中的model,present,view到底是什么,他們之間的關(guān)系是什么樣的,這只是初步認(rèn)識(shí)mvp。注意分層的概念

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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