Android 从零搭建简单MVP Demo

首先简单介绍一下MVP的构成及优缺点:git

MVP的全称为Model-View-Presenter,github

Model提供数据(网络请求、数据存储等);网络

View负责页面显示;ide

Presenter负责逻辑的处理;布局

优势:主要就是将Model层和View层彻底解耦,使得二者任一方的修改都不会对另外一方产生影响,而是将逻辑处理放在了Presenter层;post

缺点:显而易见,随着项目的增大,Presenter层也会变得臃肿,因此根据不一样项目逻辑灵活的去使用Presenter也很重要;this

以前有作过基于MVP的Android项目,根据别人写好的结构,无非就是填充代码,对于MVP总体的理解不够到位,因此该如何从头去理解一个MVP项目,对从此避免一些逻辑错误也是相当重要的。spa

下面我会以简单的登陆模块为例,结合具体代码将整个MVP分步来构建,以便更好的去理解MVP,有须要的能够将完整demo去文末clone下来。code

1.定义View层接口blog

public interface LoginView {
    void showProgress();
    void hideProgress();
    void loginSuccess();
    void loginFail();
}

2.LoginActivity实现View接口,基本页面布局就不一一展现了,只附上关键代码

LoginActivity ->

  @Override
public void showProgress() { mWaitLogin.setVisibility(View.VISIBLE); } @Override public void hideProgress() { mWaitLogin.setVisibility(View.GONE); } @Override public void loginSuccess() { Toast.makeText(this, "登陆成功", Toast.LENGTH_SHORT).show(); //登陆成功,跳转到主页面 } @Override public void loginFail() { Toast.makeText(this, "登陆失败", Toast.LENGTH_SHORT).show(); //登陆失败,停留在登陆页面 }

3.定义Model接口

public interface LoginModel {
    interface OnLoginListener {
        void onLoginSuccess();

        void onLoginFail();
    }

    void login(String username, String password, OnLoginListener listener);
}

4.实现Model接口,模拟登陆请求

public class LoginModelImpl implements LoginModel {
    @Override
    public void login(final String username, final String password, final OnLoginListener listener) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (username.equals("1") && password.equals("1")) {
                    listener.onLoginSuccess();
                } else {
                    listener.onLoginFail();
                }
            }
        }, 3000);
    }
}

5.这时咱们须要知道,在LoginActivity中点击登陆后,须要经过Presenter去控制Model来执行具体登陆操做,因此接下来定义Presenter接口

public interface LoginPresent {
    void doLogin(String username, String password);
}

6.实现Presenter接口及登陆监听接口并编写具体的逻辑

public class LoginPresentImpl implements LoginPresent,LoginModel.OnLoginListener{
    private LoginView mView;
    private LoginModel mModel;

    public LoginPresentImpl(LoginView view, LoginModel model) {
        mView = view;
        mModel = model;
    }
    @Override
    public void doLogin(String username,String password) {
        mView.showProgress();
        mModel.login(username, password, this);
    }

    @Override
    public void onLoginSuccess() {
        mView.hideProgress();
        mView.loginSuccess();
    }

    @Override
    public void onLoginFail() {
        mView.hideProgress();
        mView.loginFail();
    }
}

7.在LoginActivity中控制Presenter去进行登陆处理

mPresent = new LoginPresentImpl(this, new LoginModelImpl());

        mLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String username = mUserName.getText().toString().trim();
                String password = mPassword.getText().toString().trim();
                //简单进行非空验证
                if (username != null && !username.equals("") && password != null && !password.equals("")) {
                    //这里想要执行登陆操做,须要经过Present控制Model请求
                    mPresent.doLogin(username, password);
                } else {
                    Toast.makeText(LoginActivity.this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show();
                }

            }
        });

麻雀虽小,五脏俱全,这样一个完整的MVP模式就一步一步构建出来了。

demo连接:https://github.com/wangpeng0531/MyMVP.git

相关文章
相关标签/搜索