MVP 全稱:Model-View-Presenter ;MVP 是從經典的模式MVC演變而來,它們的基本思想有相通的地方:Controller/Presenter負責邏輯的處理,Model提供數據,View負責顯示。算法
對於MVC不瞭解的朋友能夠查此文: Android進階之路(1)-詳解MVC數據庫
Android中的MVP:微信
M層:適合作一些業務邏輯處理,好比數據庫存取操做,網絡操做,複雜的算法,耗時的任務等都在model層處理。和MVC相似網絡
V層:對應的Activity,負責xml繪製與頁面交互ide
P層:負責View與Model之間的交互3d
咱們先想一想上篇文章,咱們講到爲何要用MVC,當時咱們總結了幾點:code
然而咱們在寫MVC項目時候,也發現了一些問題: 1.對於Android中的Activity或者Fragment ,咱們不能很清晰的區分它是View仍是Controller,既有交互又有頁面繪製,這就致使了activity和fragment很「龐大」xml
2.View與Model確實是分離的,可是關聯性太強,這就致使activity與model的聯繫強,這樣咱們只要改一點點代碼, model 、view、activity 都會變,維護成本過高,View與Model以前的耦合性過高。blog
而MVP最大的改變就是View與Model實現徹底隔離。View把操做意圖給P層,P收到後,會調用Model層來實現具體的邏輯, 邏輯實現後會再通知給P, P再經過View的接口回調給View。即使V和M更改了,也不會有影響,耦合性低。接口
以登陸模塊爲例,來實現MVP
1.定義View接口- ILoginView
/** * 獲取view層的dialog * * @return retuen */ Dialog getLoadDialog(); /*** * 關閉view層的dialog */ void cancelLoadDialog(); /** * 獲取手機號參數 * * @return username */ String getPhone(); /** * 獲取密碼 * * @return password */ String getCode(); /** * 彈出消息 * * @param msg msg */ void showMsg(String msg);
View接口你們都明白吧?就是你要告訴給P的意圖。activity實現此接口。並調用P的方法:
@Override public void cancelLoadDialog() { if (dialog!=null&&dialog.isShowing()){ dialog.dismiss(); } } @Override public String getPhone() { return edPhone.getText().toString(); } @Override public String getCode() { return edCode.getText().toString(); } @Override public void showMsg(String msg) { Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_SHORT).show(); }
mPresenter.login();
2.定義Model與ModelImpl Model:
public interface ILoginModel { void login(String phone, String code, OnLoadDatasListener<CurrencyBean.DataBean> onLoadDatasListener); }
ModelImpl :
@Override public void login(String phone, String code, final OnLoadDatasListener<CurrencyBean.DataBean> onLoadDatasListener) { //填寫具體的操做邏輯與onLoadDatasListener回調 }
model實現類邏輯處理完成以後會通知給P,定義P:
/** * 登錄 */ public void login() { if (mView == null) return; if (TextUtils.isEmpty(mView.getPhone()) || TextUtils.isEmpty(mView.getCode())) { mView.showMsg("手機號或密碼不能爲空"); return; } mView.getLoadDialog().show(); loginModel.login(mView.getPhone(), mView.getCode(), new OnLoadDatasListener<CurrencyBean.DataBean>() { @Override public void onSuccess(CurrencyBean.DataBean dataBean) { Gson gson=new Gson(); mView.cancelLoadDialog(); Log.e("qzs---- ",gson.toJson(dataBean)+""); mView.loginSuccess(); } @Override public void onFailure(String error) { mView.cancelLoadDialog(); mView.loginFail(); } }); }
P經過View接口返回給View
另外MVP也是有缺點的:
你們能夠關注個人微信公衆號:「秦子帥」一個有質量、有態度的公衆號!