MVP的实现:登录为例

来源:互联网 发布:java byte二维数组 编辑:程序博客网 时间:2024/06/05 01:51

一.mvp

1.m:model负责数据模型和页面逻辑

    数据模型:用户javabean封装的数据

   业务逻辑:包括登录的动作,登录的状态,登录的具体执行.

2.view,负责具体页面的展示

   页面ui的展示:activity

   进度条的展示

   页面跳转的展示.

3.p:数据模型和view层的桥梁

  通过接口来实现:prestener层对model层的封装,然后view层调用presenter层


二.代码实现

1.model层

 数据模型:用户信息

public class User {    private String username;    private String password;    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;    }    public User(String username, String password) {        this.username = username;        this.password = password;    }    public User() {    }}
登录动作

/** * Model:登录业务逻辑 * */public interface IUserLoginModel {    /**     * 登录业务逻辑     * @param username     * @param password     * @param listener     */    void login(String username, String password, OnUserLoginListener listener);}

登录状态

/** * 用户登录回调接口 */public interface OnUserLoginListener {    /**     * 登录成功     * @param user     */    void loginSuccess(User user);    /**     * 登录失败     */    void loginFailed();}
登录具体的执行

/** * Model层,用户登录 */public class UserLoginModel implements IUserLoginModel{    @Override    public void login(final String username, final String password, final OnUserLoginListener listener) {        //模拟网络耗时操作        new Thread(new Runnable() {            @Override            public void run() {                SystemClock.sleep(1500);                //登录业务逻辑                if("heima26".equals(username) && "123456".equals(password)){//登录成功                    User user = new User(username, password);                    listener.loginSuccess(user);                }else{//登录失败                    listener.loginFailed();                }            }        }).start();    }}

2.presenter层

/** * Presenter层 * 1.p层既然起到桥梁的作用,p层必须持有model和view层对象(成员变量) * 2.既然起到桥梁的左右,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务 */public class UserLoginPresenter implements OnUserLoginListener {    private IUserLoginModel userLoginModel;//model    private IUserLoginView userLoginView;//view    /**     * 两个参数的构造方法对吗?     * 如果是两个参数,p层是给View层调用的,说明activity持有model和view的对象,说明view和model连通了,不符合MVP架构     * 所以只能是一个参数构造方法     * @param userLoginModel     * @param userLoginView     */  /*  public UserLoginPresenter(IUserLoginModel userLoginModel, IUserLoginView userLoginView) {        this.userLoginModel = userLoginModel;        this.userLoginView = userLoginView;    }*/    /**     * 所以只能是一个参数构造方法     * @param userLoginView     */    public UserLoginPresenter(IUserLoginView userLoginView) {        this.userLoginModel = new UserLoginModel();        this.userLoginView = userLoginView;    }    /**     * 沟通Model和view层的桥梁方法     */    public void login(){        //1.登录(model),下面一行代码集中体现presenter层起到桥梁作用        userLoginModel.login(userLoginView.getUsername(), userLoginView.getPassword(),this);        //2.显示滚动条(View)        userLoginView.showProgressbar();    }    @Override    public void loginSuccess(final User user) {        mHandler.post(new Runnable() {            @Override            public void run() {                //1.隐藏滚动条                userLoginView.hideProgressbar();                //2.跳转主页                userLoginView.jump2Main(user);            }        });    }    @Override    public void loginFailed() {        mHandler.post(new Runnable() {            @Override            public void run() {                //1.隐藏滚动条                userLoginView.hideProgressbar();                //2.提示用户登录失败                userLoginView.showLoginError();            }        });    }    private Handler mHandler = new Handler();}

3.view层

 ui方法的封装共p层调用

/** * View层,如何实现View层,View层是最复杂的一层 * 1.有什么操作:获取用户名、获取密码 * 2.有什么用户交互:显示滚动条、隐藏滚动条 * 3.有什么结果:登录成功跳转主页、登录失败提示用户 */public interface IUserLoginView {    /**获取用户名*/    String getUsername();    /**获取密码*/    String getPassword();    /**显示滚动条*/    void showProgressbar();    /**隐藏滚动条*/    void hideProgressbar();    /**登录成功跳转主页*/    void jump2Main(User user);    /**登录失败提示用户*/    void showLoginError();}


view具体

public class LoginActivityMVP extends Activity implements OnClickListener,IUserLoginView{    private EditText etUsername;    private EditText etPassword;    private ProgressBar progressBar;    private Context context;    private Button btnLogin;    private UserLoginPresenter presenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.login_activity_mvp);        context = this;        initViews();        btnLogin.setOnClickListener(this);    }    private void initViews() {        etUsername = (EditText) findViewById(R.id.et_username);        etPassword = (EditText) findViewById(R.id.et_password);        progressBar = (ProgressBar) findViewById(R.id.progressBar1);        btnLogin = (Button) findViewById(R.id.btnLogin);        presenter = new UserLoginPresenter(this);    }    @Override    public void onClick(View v) {        switch (v.getId()) {            case R.id.btnLogin:                presenter.login();                break;        }    }    @Override    public String getUsername() {        return etUsername.getText().toString().trim();    }    @Override    public String getPassword() {        return etPassword.getText().toString().trim();    }    @Override    public void showProgressbar() {        progressBar.setVisibility(View.VISIBLE);    }    @Override    public void hideProgressbar() {        progressBar.setVisibility(View.GONE);    }    @Override    public void jump2Main(User user) {        Toast.makeText(LoginActivityMVP.this, "登录成功,跳转主页~~~", Toast.LENGTH_SHORT).show();    }    @Override    public void showLoginError() {        Toast.makeText(LoginActivityMVP.this, "用户名或者密码错误,登录失败~~~", Toast.LENGTH_SHORT).show();    }}



  


0 0
原创粉丝点击