Android 的MVP模式理解

1.問題:

>具體到上面的demo里就是,Activity負責發(fā)起下載任務,但是不負責具體實現(xiàn);什么時候顯示ProgressDialog,顯示多少?什么時候提示錯誤信息,這一切都希望有個東西能直接告訴Activity,而不再是在Activity里再做判斷。怎樣才能做到呢?那就得靠MVP 了。

2.MVP

> MVP 模式所做的事情很簡單,就是將業(yè)務邏輯和視圖邏輯抽象到接口中。

> >定義Model,View,Presenter 接口

> >

>1. Model Interface

>Model 接口定義所有需要實現(xiàn)的業(yè)務邏輯,在我們的下載任務中,業(yè)務邏輯只有一個,就是下載;

```

public interface IDownloadModel {

/**

*下載操作

*@param url

*/

void download(String url);

}

```

>2.View 接口定義所有需要實現(xiàn)的視圖邏輯,在我們的下載任務中,視圖邏輯包括

>>

-顯示ProgressDialog;

-顯示Dialog具體進度;

-顯示具體的View(設(shè)置圖片);

-顯示錯誤信息(Toast提示)

>>3.Presenter Interface

>resenter 接口作為連接Model和View的中間橋梁,需要將二者連接起來,因此他需要完成以下工作:

?public interface IDowndownPresenter {

/**

*下載

*@param url

*/

void download(String url);

/**

*下載成功

*@param result

*/

'''

void downloadSuccess(String result);

/**

*當前下載進度

*@param progress

*/

void downloadProgress(int progress);

/**

*下載失敗

*/

void downloadFail();

}

## 總結(jié):

簡單點來說就是 model去實現(xiàn)下載任務并且獨立出來,而View負責的是view的動態(tài)變化,Presenter 去連接model和

View實現(xiàn)交互,在主Activity中我們可以繼承View中的接口以及實例化Presenter的具體實現(xiàn)類,View接口繼承的方法中我們在對應的方法中使用Presenter去實現(xiàn)業(yè)務邏輯。

##貓眼APP中的MVP框架理解:

1.首先它創(chuàng)建了一個library,把一些基本的類以及有關(guān)網(wǎng)絡(luò)的一些類也寫在里面

2.接下來我們來初步理解下他的MVP框架,

> 在這個library中,他的具體的視圖邏輯定義了一個類ICoreLoadingView來顯示視圖,該類具體有如下幾個方法:

public interface ICoreLoadingView {

void showLoading();

void showContent();

void showError(String errorMsg);

}

>由于是一個基本的類,說以我們只是和視圖接口實現(xiàn)了連接下面我們來看看這個基本類中實現(xiàn)得方法:

public interface ICorePresenter {

void onViewStop();

void onViewDestroy();

}

3.既然我們已經(jīng)定義了具體的ICorePresenter接口,現(xiàn)在我們就應該定義一個基本的類來實現(xiàn)這個接口,BaseMVPPresenter 繼承自ICorePresenter,值得注意的是我們可以看到它在構(gòu)造方法中接受了兩個數(shù)據(jù),Activity mActivity和T mView來一邊在我們具體的實現(xiàn)的時候來實現(xiàn)我們的業(yè)務邏輯和視圖邏輯的交互,還有就是由于項目使用的是Rxjava+retrofit+MVP 模式的編程我們還使用CompositeDisposable這個容器來實現(xiàn)訂閱事件的創(chuàng)建與回收。

4 . 下面我們來看看在具體的項目中我們是怎么去實現(xiàn)MVP框架的,我們就以這個熱門頁面為例,首先我們可以看到我們定義了兩個熱門頁獨立的接口,視圖邏輯接口:

public interface IHotMovieListView extends ICoreLoadingView {

void addHotMovieList????(List hot);

void addMovieIds(List movieIds);

void addMoreMovies(List movies);

void loadMoreError();

void loadMoreCompleted();

}

-第二個接口就是我們的IHotMoviePresenter:

public interface IHotMoviePresenter{

void getHotMovieList(int limit);

void getMoreHotMovieList(int headline,String movieIds);

}

那我們的業(yè)務邏輯接口我們又應該怎么去實現(xiàn)呢?

我們寫了一個網(wǎng)絡(luò)熱門頁數(shù)據(jù)請求的管理類HotMovieListManager來實現(xiàn)數(shù)據(jù)的請求,在我們的presenter接口實現(xiàn)HotMovieListPresenter(繼承自BaseMVPPresenter 以及獨立接口IHotMoviePresenter)我們在這里把網(wǎng)絡(luò)請求添加到容器中,讓后我們可以在fragment中來講繼承我們所寫的實現(xiàn)接口。

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

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