Android MVP模式例子

       之前看了很多关于MVP模式的简介,很多时候都是看完之后有很多疑惑,再或者是过几天就忘记了。今天突然有想起来了,然后又看了看定义,接着参照了一些demo,自己完整的将代码重新写了一边,使得印象更加深刻一点。
这个是我根据网上的一些demo(基本代码都是参照的一位大神的),然后根据自己的理解做出的demo(跟网上很多都是大同小异),希望在以后的项目开发中能够用的上。
这里界面也是一个登陆界面
这里写图片描述
     
      这是我的代码分类
     
      这里写图片描述

按照我自己的理解,首先我们需要定义出数据模型 LoginBean
,这里面主要是定义了一些我们界面所需的数据

public class LoginBean {
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    private String username;
    private String password;

}

接下来我们需要定义我们登陆时的操作方法及需要调用的参数及监听接口

LoginBeanModle

public interface LoginBeanModle {
    /**
     * 登陆数据模块操作
     *
     * @param username
     * @param password
     * @param onLoginListener
     */
     void login(String username, String password, OnLoginListener onLoginListener);
}

然后是登陆实体的实现代码,里面开启了一个线程(主要执行耗时操作)来发送登陆请求。
LoginModeImple

public class LoginModeImple implements LoginBeanModle {
    @Override
    public void login(final String username, final String password, final OnLoginListener onLoginListener) {
        //开启一个线程执行耗时操作
        new Thread() {
            @Override
            public void run() {
                try {
                //模拟从网络加载数据
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if ("username".equals(username) && "password".equals(password)) {
                    LoginBean loginBean = new LoginBean();
                    loginBean.setUsername(username);
                    loginBean.setPassword(password);
                    onLoginListener.onSuccess(loginBean);
                } else {
                    onLoginListener.onFailed();
                }

            }
        }.start();
    }
}

接下来,定义一个控制器,来对登陆操作之后的结果进行处理
LoginPresenter

public class LoginPresenter {
    private LoginBeanModle loginBeanModle;
    private LoginView loginView;
    private Handler mHandler = new Handler();

    public LoginPresenter(LoginView loginView) {
        this.loginBeanModle = new LoginModeImple();
        this.loginView = loginView;
    }

    public void login() {
        //设置进度条可见
        loginView.showLoading();
        loginBeanModle.login(loginView.getUserName(), loginView.getPassword(), new OnLoginListener() {
            @Override
            public void onSuccess(final LoginBean loginBean) {
                //在UI线程中执行
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        loginView.userLogin(loginBean);
                        loginView.hideLoading();
                    }
                });
            }

            @Override
            public void onFailed() {
                //在UI线程中执行
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        loginView.showFailError();
                        loginView.hideLoading();
                    }
                });
            }
        });
    }
}

在界面显示上,我们还需要定义一个操作界面的接口
LoginView

public interface LoginView {
    //获取用户名称
    String getUserName();

    //获取用户密码
    String getPassword();

    //登陆成功方法
    void userLogin(LoginBean loginBean);

    //登陆失败方法
    void showFailError();

    //显示加载进度条
    void showLoading();

    //隐藏加载进度条
    void hideLoading();
}

最后,是我们在Activity中的实现

public class MainActivity extends Activity implements LoginView, View.OnClickListener {
    private EditText edUseName;
    private EditText edPassword;
    private Button btnLogin;
    private LoginPresenter loginPresenter = new LoginPresenter(this);
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        init();

    }

    private void init() {
        edUseName = (EditText) findViewById(R.id.ed_username);
        edPassword = (EditText) findViewById(R.id.ed_password);
        progressBar = (ProgressBar) findViewById(R.id.progressbar);
        btnLogin = (Button) findViewById(R.id.btn_login);
        btnLogin.setOnClickListener(this);
    }

    @Override
    public String getUserName() {
        return edUseName.getText().toString();
    }

    @Override
    public String getPassword() {
        return edPassword.getText().toString();
    }

    @Override
    public void userLogin(LoginBean loginBean) {
        Toast.makeText(this, getUserName() + "登陆成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showFailError() {
        Toast.makeText(this, getUserName() + "登陆失败", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void showLoading() {
        progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideLoading() {
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            //控制层控制登陆操作
            case R.id.btn_login:
                loginPresenter.login();
                break;
            default:
                break;
        }
    }
}

    写这篇博客的目的只是为了加深自己对MVP模式的理解,因为看再多的代码,看再多的定义还不如自己手动敲代码来时记忆的更加深刻,理解的 更加透测。
    利用MVP模式来设计项目架构,虽然代码量增加了很多,但是确实是View里面的代码变的更加精简了,对以后的代码维护肯定也会很方便。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值