rxjava+retrofit+mvp

有一段時(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

引用:Android----MVP模式的理解

好了,理論和例子網(wǎng)上肯定是很多很多的,那么我們開始實(shí)踐,以下例子是在前一篇基礎(chǔ)上做修改的傳送門(數(shù)據(jù)請(qǐng)求然后頁面顯示請(qǐng)求的json數(shù)據(jù))。


架構(gòu)思想

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


定義一個(gè)接口實(shí)現(xiàn)數(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ù),這里我只定義了成功和失敗的接口方法:


view層


當(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)的歡迎提出意見。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容