MVP简介
MVP的出发点是关注点分离,将视图和业务逻辑解耦。Model-View-Presenter三个部分可以简单理解为:
- Model是将在视图中显示的数据。
- View是显示数据(model)的界面,同时将用户指令(事件)发送给Presenter来处理。View通常含有Presenter的引用。在Android中Activity,Fragment和ViewGroup都扮演视图的角色。
- Presenter是中间人,同时有两者的引用。请注意单词model非常有误导性。它应该是获取或处理model的业务逻辑。例如:如果你的数据库表中存储着User,而你的视图想显示用户列表,那么Presenter将有一个数据库业务逻辑(例如DAO)类的引用,Presenter通过它来查询用户列表。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
public void onClick() {
// 账号和密码是否符合规范
if (RegexUtils.verifyUsername(mUserName)!=RegexUtils.VERIFY_SUCCESS){
// 账号不合规范时显示一个对话框提示
AlertDialogFragment.getInstances(getString(R.string.username_error),getString(R.string.username_rules))
.show(getSupportFragmentManager(),"usernameError");
return;
}
// 密码不合规范时显示一个另一个对话框提示
if (RegexUtils.verifyPassword(mPassword)!=RegexUtils.VERIFY_SUCCESS){
AlertDialogFragment.getInstances(getString(R.string.password_error),getString(R.string.password_rules))
.show(getSupportFragmentManager(),"passwordError");
return;
}
// 如果都符合正确注册规则,进行注册的业务,我们写一个异步任务来模拟登录的网络请求
@Override
protected void onPreExecute() {
super.onPreExecute();
// 进度条展示
showProgress();
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// 拿到数据处理UI
// 隐藏进度、显示信息、跳转页面
hideProgress();
showMessage("注册成功");
navigateToHome();
}
}.execute();
}
这样看起来并没有什么不对,但是慢慢的你会发现,当本activity里面的代码、业务逻辑等多起来,出错之后就不好找错误的地方,并且看起来非常不舒服,所以此时,mvp模式就起到了作用了。
2. Presneter:业务类里面,去执行业务拿到View需要的数据
3. 拿到数据之后,数据要给视图View设置上
我们的目的是想要把视图和业务分离
不建议直接拿视图的对象来操作,接口:接口回调
在业务过程中视图的操作:定义一个接口
public interface RegisterView {
void showProgress();// 显示进度
void hideProgress();// 隐藏进度
void showMessage(String msg);// 显示信息
void navigateToHome();// 跳转页面
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
public void onClick() {
// 账号和密码是否符合规范
if (RegexUtils.verifyUsername(mUserName)!=RegexUtils.VERIFY_SUCCESS){
// 账号不合规范时显示一个对话框提示
AlertDialogFragment.getInstances(getString(R.string.username_error),getString(R.string.username_rules))
.show(getSupportFragmentManager(),"usernameError");
return;
}
// 密码不合规范时显示一个另一个对话框提示
if (RegexUtils.verifyPassword(mPassword)!=RegexUtils.VERIFY_SUCCESS){
AlertDialogFragment.getInstances(getString(R.string.password_error),getString(R.string.password_rules))
.show(getSupportFragmentManager(),"passwordError");
return;
}
// 如果都符合正确注册规则,进行注册的业务
public class RegisterPresenter {
private RegisterView mRegisterView;
public RegisterPresenter(RegisterView registerView) {
mRegisterView = registerView;
}
注册的业务实现
public void register(){
new AsyncTask<Void, Integer, Void>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
// 进度条展示
mRegisterView.showProgress();
}
@Override
protected Void doInBackground(Void... params) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
// 拿到数据处理UI
// 隐藏进度、显示信息、跳转页面
mRegisterView.hideProgress();
mRegisterView.showMessage("注册成功");
mRegisterView.navigateToHome();
}
}.execute();
}
}