其他的理解什么的先不说,先看看自己的需求,假如我就需要一个登录的功能,具体的界面如图:
需要用户输入用户名和密码。点击登录,判断是否登录成功,点击清除,清除输入的数据。由于只是体验一把MVP现规定只有账号为“zhy”,密码为“123”才能正确登录,其他为失败。
MVP 总体的设计思想是通过接口回调的方式,将逻辑进行解耦和。那么我们来看一下我们实现这个功能需要些什么。
1.首先需要一个实体类也就是(Modle)
public class User {
private String userName;
private String pwd;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
2.需要对输入框及结果做判断,返回相应的信息,包含
可以看到我们有两个按钮,一个是login,一个是clear;
login说明了要有用户名、密码,那么对应两个方法:
String getUserName();
String getPassword();1234
再者login是个耗时操作,我们需要给用户一个友好的提示,一般就是操作ProgressBar,所以再两个:
void showLoading();
void hideLoading();123
login当然存在登录成功与失败的处理,我们主要看成功我们是跳转Activity,而失败可能是去给个提醒:
void toMainActivity(User user);
void showFailedError();123
ok,login这个方法我们分析完了~~还剩个clear那就简单了:
void clearUserName();
void clearPassword();而这些就是我们需要的view.
public interface IUserLoginView { String getUserName();//获取输入用户名 String getPassword();///获取输入的密码 void clearUserName();//清除用户名 void clearPassword();//清除密码 void showLoading();//正在加载 void hideLoading();//加载结束 void toMainActivity(User user);//成功提示 void showFailedError();//失败提示 }
3.我们做完了这些,只是单独的完成了view和modle各自的功能,他们之间还没有建立关系,这就没法实现我们具体需要的登录和清除的功能,那我们就开是建立他们之间的联系也就是presenter层。
先来看一下登录,首先他需要一个login的方法;在这个方法中我们要判断输入的内容,以及返回相应的结果
a.定义操作具体业务类的回调接口:OnLoginListener,用于回调监听登陆结果状态
public interface OnLoginListener { void loginSuccess(User user); void loginFailed(); }
b.定义操作业务类的抽象接口:IUserBiz
public interface IUserBiz { void login(String userName,String pwd,OnLoginListener loginListener); }
c.实现操作业务类的抽象接口:UserBiz
public class UserBiz implements IUserBiz { @Override public void login(final String userName, final String pwd, final OnLoginListener loginListener) { //模拟子线程耗时操作 new Thread() { @Override public void run() { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } //模拟登录成功 if ("zhy".equals(userName) && "123".equals(pwd)) { User user = new User(); user.setUserName(userName); user.setPwd(pwd); loginListener.loginSuccess(user); } else { loginListener.loginFailed(); } } }.start(); } }
定义好这些我们来看一下presenter的书写
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(); } }
这些都写完了,那么我们还没有和我们最熟悉的activity进行交互,现在我们来看看具体的交互过程。
public class MainActivity extends AppCompatActivity 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_main); 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(); } }
这样简单的mvp模式算是完成。