Android开发中的MVP模式的使用记录

    xiaoxiao2021-03-25  59

    一 .Mvp的基础: View 对应于Activity,负责View的绘制以及与用户交互Model 依然是业务逻辑和实体模型Presenter 负责完成View于Model间的交互  MVC中是允许Model和View进行交互的,而MVP中很明显,Model与View之间的交互由Presenter完成。还有一点就是Presenter与View之间的交互是通过接口的(代码中会体现)。 代码例子: /** * 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{ //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);    // new presenter的对象,调用方法 } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnLogin: presenter.login();                        //--->调用login方法,是presenter实现了OnUserLoginListener的接口;     presenter中有view和model的引用,而model又实现了IUserLoginModel ————>void login(String username, String password, OnUserLoginListener listener);                break; } } //对接口方法的具体实现,这个接口主要处理的是view的具体变化 @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(); } } //Presenter 处理view和model的交互类,中间作为1个关系的对接链,即把的到view传递过来的数据,传递到Model进行处理,又把Model处理后的结果通过Presenter返回给view进行变化;/** * Presenter * 1.p层既然起到桥梁的作用,p层必须持有modelview层对象(成员变量) * 2.既然起到桥梁的作用,所以需要提供桥梁方法,当前的业务逻辑是登录,所以桥梁方法也是为了登录服务 */  public class UserLoginPresenter implements OnUserLoginListener { private IUserLoginModel userLoginModel;//model private IUserLoginView userLoginView;//view /** * 两个参数的构造方法对吗? * 如果是两个参数,p层是给View层调用的,说明activity持有modelview的对象,说明viewmodel连通了,不符合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; } /** * 沟通Modelview层的桥梁方法 */ 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(); } /** * 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(); } } /** * 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(); }  
    转载请注明原文地址: https://ju.6miu.com/read-39546.html

    最新回复(0)