Android進階之路(2)-詳解MVP

MVP簡介

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

爲何要用MVP

咱們先想一想上篇文章,咱們講到爲何要用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 DEMO

以登陸模塊爲例,來實現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也是有缺點的:

  • 增長代碼的複雜度
  • 實現難度增長
  • 若是某特定視圖的渲染不少(activity),就會形成Presenter與該視圖聯繫過於緊密,一旦該視圖須要變動,那麼Presenter也須要變動了,不能如預期的那樣下降耦合度和增長複用性。

你們能夠關注個人微信公衆號:「秦子帥」一個有質量、有態度的公衆號!

公衆號

相關文章
相關標籤/搜索