有一段時(shí)間沒有更新文章了,最近都在忙公司的項(xiàng)目偶爾閑下來也是針對(duì)之前的框架補(bǔ)一些七七八八的功能。包括一些第三方的以及工具類。
這次主要是針對(duì)之前 Rxjava+retrofit二次封裝的修改:添加mvp的架構(gòu)思想。之前一直沒有添加是因?yàn)楦杏X自己封裝的網(wǎng)絡(luò)請(qǐng)求其實(shí)已經(jīng)算是很簡(jiǎn)便了。

一個(gè)請(qǐng)求添加上返回?cái)?shù)據(jù)的封裝類,Activity繼承HttpOnNextListener 重新 onNext方法就可以實(shí)現(xiàn)一個(gè)基本的網(wǎng)絡(luò)請(qǐng)求過程了。
其實(shí)之后的mvp寫法,代碼量和這個(gè)差不多。那么既然都可以這么簡(jiǎn)單了為什么還要用mvp模式呢?實(shí)際上這種架構(gòu)的寫法好處不僅僅體現(xiàn)在代碼量的多少更在于他的維護(hù)。
一、MVP的理解
在Android開發(fā)中,Activity和Fragment承載了太多的開發(fā)任務(wù),它們不僅負(fù)責(zé)展示UI,更由于它們有生命周期這一特性,我們同樣會(huì)把許多的業(yè)務(wù)邏輯(controller層)的東西寫在activity中,這樣就造成的Activity和Fragment非常的臃腫,維護(hù)起來相當(dāng)?shù)穆闊?。為了解決這種問題,在程序開發(fā)中使用mvp設(shè)計(jì)模式顯得十分必要。
MVP模式的核心思想:
MVP把Activity中的UI邏輯抽象成View接口,把業(yè)務(wù)邏輯抽象成Presenter接口,Model類還是原來的Model。
Mvp模式的好處:
1.分離了視圖邏輯和業(yè)務(wù)邏輯,降低了耦合
2.Activity只處理生命周期的任務(wù),代碼變得更加簡(jiǎn)潔
3.視圖邏輯和業(yè)務(wù)邏輯分別抽象到了View和Presenter的接口中去,提高代碼的可閱讀性
4.Presenter被抽象成接口,可以有多種具體的實(shí)現(xiàn),所以方便進(jìn)行單元測(cè)試
5.把業(yè)務(wù)邏輯抽到Presenter中去,避免后臺(tái)線程引用著Activity導(dǎo)致Activity的資源無法被系統(tǒng)回收從而引起內(nèi)存泄露和OOM
好了,理論和例子網(wǎng)上肯定是很多很多的,那么我們開始實(shí)踐,以下例子是在前一篇基礎(chǔ)上做修改的傳送門(數(shù)據(jù)請(qǐng)求然后頁面顯示請(qǐng)求的json數(shù)據(jù))。

1、首先我們創(chuàng)建一個(gè)model獲取數(shù)據(jù)

定義一個(gè)model的父類實(shí)現(xiàn)基本的初始化以及回調(diào)

這里我們還實(shí)現(xiàn)了一個(gè)HttpOnNextListener實(shí)現(xiàn)數(shù)據(jù)的回調(diào)(rxjava+retrofit二次封裝的結(jié)果,onNext方法即可獲取結(jié)果數(shù)據(jù),之前我們寫在activity的代碼由于使用了mvp模式,故將此邏輯代碼寫在model層)可以看到我們使用了一個(gè)CallBack將數(shù)據(jù)回調(diào)出去。
定義一個(gè)Model類繼承父類并實(shí)現(xiàn)接口。

2、實(shí)現(xiàn)View層
view層其實(shí)很簡(jiǎn)單,主要是獲取請(qǐng)求得到的數(shù)據(jù),這里我只定義了成功和失敗的接口方法:

當(dāng)然,這里可以添加請(qǐng)求進(jìn)度的方法,比如實(shí)現(xiàn)回調(diào)過程是一個(gè)進(jìn)度對(duì)話框,請(qǐng)求成功對(duì)話框消失。因?yàn)檫@里我對(duì)rxjava+retrofit進(jìn)行了進(jìn)度對(duì)話框的封裝,故沒有在view層再做這個(gè)任務(wù)。
3、實(shí)現(xiàn) presenter層
presenter是view層和model層的橋梁,起到一個(gè)非常大的作用。presenter將model層的數(shù)據(jù)處理結(jié)果返回給view層做頁面邏輯的處理
首先定義個(gè)接口類

其中 onInit()方法主要是數(shù)據(jù)的初始化,這里我們主要做的是請(qǐng)求參數(shù)的封裝(通過map集合的方式)
onDataCreate()方法是主要數(shù)據(jù)的處理

可以看到數(shù)據(jù)通過callBack回調(diào)出來,然后實(shí)現(xiàn)view層的setdata的方法,這樣就將數(shù)據(jù)填充進(jìn)去,Activity或者Fragment就可以實(shí)現(xiàn)View層的接口得到數(shù)據(jù)
4、Activity、Fragment實(shí)現(xiàn)
Activity或者Fragment實(shí)現(xiàn)View層的接口

重寫setData()方法

總結(jié):
mvp的基本寫法就是以上這樣的一個(gè)網(wǎng)絡(luò)請(qǐng)求的例子,當(dāng)然mvp架構(gòu)思想并不是統(tǒng)一的一個(gè)寫法,他是一種思想。所以每個(gè)人可以根據(jù)自己具體的項(xiàng)目寫成自己方便的寫法。
最后:
如果有哪些值得改進(jìn)的歡迎提出意見。