Android开发中的MVP模式

来源:互联网 发布:南京 知乎 编辑:程序博客网 时间:2024/06/06 04:58
http://blog.csdn.net/lmj623565791/article/details/46596109; 

本文出自:【张鸿洋的博客】

 网上很多nvp的介绍,但是写的有点乱,闲来整理一下,以备随时领悟。

 MVP内容:

  • View 对应于Activity,负责View的绘制以及与用户交互
  • Model 依然是业务逻辑和实体模型
  • Presenter 负责完成View于Model间的交互
简单例子:
  

(一)Model

首先实体类User不用考虑这个肯定有,其次从效果图可以看到至少有一个业务方法login(),这两点没什么难度,我们首先完成:

package com.zhy.blogcodes.mvp.bean;/** * Created by zhy on 15/6/18. */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;    }}
package com.zhy.blogcodes.mvp.biz;/** * Created by zhy on 15/6/19. */public interface IUserBiz{    public void login(String username, String password, OnLoginListener loginListener);}
package com.zhy.blogcodes.mvp.biz;import com.zhy.blogcodes.mvp.bean.User;/** * Created by zhy on 15/6/19. */public class UserBiz implements IUserBiz{    @Override    public void login(final String username, final String password, final OnLoginListener loginListener)    {        //模拟子线程耗时操作        new Thread()        {            @Override            public void run()            {                try                {                    Thread.sleep(2000);                } catch (InterruptedException e)                {                    e.printStackTrace();                }                //模拟登录成功                if ("zhy".equals(username) && "123".equals(password))                {                    User user = new User();                    user.setUsername(username);                    user.setPassword(password);                    loginListener.loginSuccess(user);                } else                {                    loginListener.loginFailed();                }            }        }.start();    }}
package com.zhy.blogcodes.mvp.biz;import com.zhy.blogcodes.mvp.bean.User;/** * Created by zhy on 15/6/19. */public interface OnLoginListener{    void loginSuccess(User user);    void loginFailed();}

(二) View

上面我们说过,Presenter与View交互是通过接口。所以我们这里需要定义一个ILoginView,难点就在于应该有哪些方法,我们看一眼效果图:

可以看到我们有两个按钮,一个是login,一个是clear;

login说明了要有用户名、密码,那么对应两个方法:

    String getUserName();    String getPassword();
  • 1
  • 2
  • 3
  • 4

再者login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBar,所以再两个:

    void showLoading();    void hideLoading();
  • 1
  • 2
  • 3

login当然存在登录成功与失败的处理,我们主要看成功我们是跳转Activity,而失败可能是去给个提醒:

    void toMainActivity(User user);    void showFailedError();
  • 1
  • 2
  • 3

ok,login这个方法我们分析完了~~还剩个clear那就简单了:

    void clearUserName();    void clearPassword();
  • 1
  • 2
  • 3

综上,接口完整为:

package com.zhy.blogcodes.mvp.view;import com.zhy.blogcodes.mvp.bean.User;/** * Created by zhy on 15/6/19. */public interface IUserLoginView{    String getUserName();    String getPassword();    void clearUserName();    void clearPassword();    void showLoading();    void hideLoading();    void toMainActivity(User user);    void showFailedError();}

View的实现类,哈,其实就是Activity,文章开始就说过,MVP中的View其实就是Activity。

package com.zhy.blogcodes.mvp;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ProgressBar;import android.widget.Toast;import com.zhy.blogcodes.R;import com.zhy.blogcodes.mvp.bean.User;import com.zhy.blogcodes.mvp.presenter.UserLoginPresenter;import com.zhy.blogcodes.mvp.view.IUserLoginView;public class UserLoginActivity extends ActionBarActivity implements IUserLoginView{    private EditText mEtUsername, mEtPassword;    private Button mBtnLogin, mBtnClear;    private ProgressBar mPbLoading;    private UserLoginPresenter mUserLoginPresenter = new UserLoginPresenter(this);    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_user_login);        initViews();    }    private void initViews()    {        mEtUsername = (EditText) findViewById(R.id.id_et_username);        mEtPassword = (EditText) findViewById(R.id.id_et_password);        mBtnClear = (Button) findViewById(R.id.id_btn_clear);        mBtnLogin = (Button) findViewById(R.id.id_btn_login);        mPbLoading = (ProgressBar) findViewById(R.id.id_pb_loading);        mBtnLogin.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View v)            {                mUserLoginPresenter.login();            }        });        mBtnClear.setOnClickListener(new View.OnClickListener()        {            @Override            public void onClick(View v)            {                mUserLoginPresenter.clear();            }        });    }    @Override    public String getUserName()    {        return mEtUsername.getText().toString();    }    @Override    public String getPassword()    {        return mEtPassword.getText().toString();    }    @Override    public void clearUserName()    {        mEtUsername.setText("");    }    @Override    public void clearPassword()    {        mEtPassword.setText("");    }    @Override    public void showLoading()    {        mPbLoading.setVisibility(View.VISIBLE);    }    @Override    public void hideLoading()    {        mPbLoading.setVisibility(View.GONE);    }    @Override    public void toMainActivity(User user)    {        Toast.makeText(this, user.getUsername() +                " login success , to MainActivity", Toast.LENGTH_SHORT).show();    }    @Override    public void showFailedError()    {        Toast.makeText(this,                "login failed", Toast.LENGTH_SHORT).show();    }}

(三)Presenter

Presenter是用作Model和View之间交互的桥梁,那么应该有什么方法呢?

其实也是主要看该功能有什么操作,比如本例,两个操作:login和clear。

package com.zhy.blogcodes.mvp.presenter;import android.os.Handler;import com.zhy.blogcodes.mvp.bean.User;import com.zhy.blogcodes.mvp.biz.IUserBiz;import com.zhy.blogcodes.mvp.biz.OnLoginListener;import com.zhy.blogcodes.mvp.biz.UserBiz;import com.zhy.blogcodes.mvp.view.IUserLoginView;/** * Created by zhy on 15/6/19. */public class UserLoginPresenter{    private IUserBiz userBiz;    private IUserLoginView userLoginView;    private Handler mHandler = new Handler();    public UserLoginPresenter(IUserLoginView userLoginView)    {        this.userLoginView = userLoginView;        this.userBiz = new UserBiz();    }    public void login()    {        userLoginView.showLoading();        userBiz.login(userLoginView.getUserName(), userLoginView.getPassword(), new OnLoginListener()        {            @Override            public void loginSuccess(final User user)            {                //需要在UI线程执行                mHandler.post(new Runnable()                {                    @Override                    public void run()                    {                        userLoginView.toMainActivity(user);                        userLoginView.hideLoading();                    }                });            }            @Override            public void loginFailed()            {                //需要在UI线程执行                mHandler.post(new Runnable()                {                    @Override                    public void run()                    {                        userLoginView.showFailedError();                        userLoginView.hideLoading();                    }                });            }        });    }    public void clear()    {        userLoginView.clearUserName();        userLoginView.clearPassword();    }}

大致就是从View中获取需要的参数,交给Model去执行业务方法,执行的过程中需要的反馈,以及结果,再让View进行做对应的显示。