随着Android多年的发展和积累,其开发的架构模式也逐渐发展的多种多样。最近研究了下安卓开发的MVP模式。本文做下总结。和简单介绍。以及学习中demo。

##基础:

MVC: Model-view-controller
MVP: Model-view-presenter

View层: 视图层,包含界面相关的功能。如各种:Activity,Fragment,View.

Presenter层:逻辑控制层,充当中间人角色。用来隔离View层和Model层。

Model层:封装各种数据源信息。实体类。

Controller: 逻辑业务层。

##一,简单介绍:

###1,概念:
####1.1传统的mvc模式:
mvc是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、控制器三层。

Mvc中:Model层和View层是直接相互通信的,而且Controller是基于行为的,可以被多个View共享。

其中MVC关系如图:

这里写图片描述

####1.2Mvp模式:
mvp是经典的mvc的延伸和改进,

Mvp中View层和Model并没有直接通信,而是通过中间人Presenter来间接通信的。Presenter和View以及model交互都是通过接口进行的。 通常View和Presenter是一对的,当然,复杂的View可能需要多个Presenter来共同处理,这些需要根据具体的业务需求而定。

关系图:
这里写图片描述

##2.LoginDemo:

1,demo逻辑:
这里写图片描述

2,
demo中:Presenter 持有modle 的引用:
view 持有 Presenter的 引用。 view
和modle 通过Presenter交互。

LoginActiivty.java:

/**
 * 登录界面   view
 * 实现  ILoginView Presenter 和 LoginActivity 通过接口交互。  并
 */
public class LoginActivity extends BaseActivity implements ILoginView{

    private ProgressDialog preDialog;

    // 初始化   登录数据控制器
    private LoginPresenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);

        account.setText("zhaoqiang");
        pwd.setText("zhaoqiang");
        //初始化  控制器
        loginPresenter = new LoginPresenter(this);
    }

    @OnClick(R.id.submit_btn)
    public void submitBtnclick(){
        String acc = account.getText().toString().trim();
        String passWd = pwd.getText().toString().trim();
        preDialog = ProgressDialog.show(this,"正在登录...",null);
        //TODO  创建进度框:
        loginPresenter.iLoginPrToLogin(acc,passWd);
    }

    /**
     * 该方法  由  ILoginview 回调
     */
    @Override
    public void iLoginViewSuccess() {
        preDialog.dismiss();
        preDialog = null;
        //登录  成功  处理ui数据
        Toast.makeText(this,"登录成功",Toast.LENGTH_LONG).show();
        startActivity(new Intent(this, MainActivity.class));
        finish();
    }

    /**
     * 该方法  由   ILoginview  回调
     */
    @Override
    public void iLoginViewFailed() {
        //登录 失败 处理UI数据
        preDialog.dismiss();
        preDialog = null;

        Toast.makeText(this,"登录失败,请验证账号密码",Toast.LENGTH_LONG).show();
    }

    @OnClick(R.id.cancel_btn)
    public void cancelBtnclick(){
        finish();
    }
}

LoginPresenter.java:

数据控制器:

/**
 *
 * 登录的  数据控制器  实现登录数据控制器接口
 * 实现逻辑业务
 *
 * 去登陆
 * 登录成功    失败回调   实现数据回调   并将回调数据返回  View
 */
public class LoginPresenter implements ILoginPresenter,OnLoginFinishedListener {

    //present 持有  view 和 modle 的 引用   modle 和View  通过p  交互
    private ILoginView view;
    private AsyncLoginTask task;  //处理  异步任务

    /**
     * 将  当前的需要处理的View 传进来   这边用于回调处理数据
     * @param loginView  需要处理的View    实现 ILoginView 接口
     */
    public LoginPresenter(ILoginView loginView) {
        this.view = loginView;
        this.task = new AsyncLoginTask(); //创建  异步任务类
    }

    /**
     * 去登陆  传入 账号密码   将当前类作为 回调类
     * @param username 账号
     * @param password 密码
     */
    @Override
    public void iLoginPrToLogin(String username, String password) {
        //执行 异步任务:  请求数据   将this  作为监听器
        task.validateCredentAsync(this,new UserBean(username,password));
    }

    @Override
    public void onLoginFishedLisSuccess() {
        view.iLoginViewSuccess();
    }

    @Override
    public void onLoginFishedLisError() {
        view.iLoginViewFailed();
    }

}

本例子 只是实现了 简单的 登录界面,并没有真正实现网络数据访问。对于modle的封装也比较简化。需要看源码的同学请移步github。

https://github.com/zqHero/MyMvpDemo

若想看完整版的mvpdemo:请移步下面:
完整版的实例:使用retrofit+butterknife+mvp : modle 也进行了完整封装:
https://github.com/zqHero/Mvp-demo2 欢迎fork 或 star.

参考:Android-高级进阶,顾浩鑫 一书(电子工业出版社)
感谢:https://github.com/jpotts18 android-mvp 代码。

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐