MVP的实现:登录为例

一.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值