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也须要变动了,不能如预期的那样下降耦合度和增长复用性。

你们能够关注个人微信公众号:「秦子帅」一个有质量、有态度的公众号!

公众号

相关文章
相关标签/搜索