说到架构,这个是个很高深的问题,不懂。。但是,对于mvp架构来说,不算是太懂,但是也略知一二,今天来说道说道。
大家都知道mvc架构很经典,极大的简易了开发,提高了开发效率等等,很多优势,但是,那个是适用于网站开发的,对于app开发来说,就不太适用了。
mvc 的 v 就对应布局文件了,但是,布局文件做的事情挺少,(不讨论data-binder),这样事件的处理,数据的绑定都在activity中了,那activity的逻辑会很混乱了,所以mvp
就应运而生了。mvp架构是这样的:
- View负责UI显示、用户交互
- Presenter负责业务逻辑处理
- Model负责数据处理
恩,就是这样的,与mvc的最大区别就是View与model并不直接交互,并且事情都交给presenter,activity不需要做什么事情。非常棒~
Android 中的MVP:
- UI层一般包括activity,fragment,adapter等直接和UI相关的类
- UI层的Activity在启动之后实例化相应的Presenter,App的控制权后移,
- 由UI转移到Presenter,两者之间的通信通过接口完成,只传递事件和
结果。
- Presenter创建对应的Model,并操纵Model获取和处理数据,处理结果
首先被Presenter获得,然后Presenter再去更新View。
oh了,了解了这么多的好处之后,那就直接上代码了。等会,先上张图~
恩,这个就是我写的结构啦~。
先来View层代码~
public interface LoginView {
String getUsername();
String getPassword();
boolean checkNull(String username,String passwrod);
void setUserNullError();
void setUserError();
void ShowProgress();
void hideProgress();
}
public interface ILoginPresenter {
void login(String username,String password);
}
public class LoginPresenter implements ILoginPresenter{ LoginView loginView; public LoginPresenter(LoginView loginView,LoginStatus loginStatus){ this.loginView=loginView; this.loginStatus=loginStatus; } @Override public void login(final String username, final String password) { if(loginView==null){ return; } if(loginView.checkNull(username,password)){ loginView.ShowProgress(); new Handler().postDelayed(new Runnable() { @Override public void run() { loginView.hideProgress(); if(username.equals("zhangsan") && password.equals("123")){ if(loginStatus!=null){ LoginModel loginModel=new LoginModel(username,password); loginStatus.LoginSuccess(loginModel); } }else { if(loginStatus!=null){ loginStatus.LoginFail(); } } } },2000); }else{ loginView.setUserNullError(); } } public interface LoginStatus{ void LoginSuccess(LoginModel loginModel); void LoginFail(); } private LoginStatus loginStatus;
恩,model就不上了,很简单,最后就是activity了
public class LoginActivity extends Activity implements LoginView,LoginPresenter.LoginStatus,View.OnClickListener{
EditText username,password;
ProgressBar progressBar;
ILoginPresenter iLoginPresenter;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
username= (EditText) findViewById(R.id.username);
password= (EditText) findViewById(R.id.password);
progressBar= (ProgressBar) findViewById(R.id.progress);
button= (Button) findViewById(R.id.button);
button.setOnClickListener(this);
iLoginPresenter=new LoginPresenter(this,this);
}
@Override
public String getUsername() {
return username.getText().toString();
}
@Override
public String getPassword() {
return password.getText().toString();
}
public void showToast(String message) {
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
@Override
public boolean checkNull(String username, String passwrod) {
if(!TextUtils.isEmpty(username) && !TextUtils.isEmpty(passwrod)){
return true;
}
return false;
}
@Override
public void setUserNullError() {
showToast("账号或者密码不能为空");
}
@Override
public void setUserError() {
showToast("账号跟密码不匹配");
}
@Override
public void ShowProgress() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
progressBar.setVisibility(View.INVISIBLE);
}
@Override
public void LoginSuccess(LoginModel loginModel) {
showToast("登录成功:"+loginModel.getUsername());
}
@Override
public void LoginFail() {
setUserError();
}
@Override
public void onClick(View v) {
iLoginPresenter.login(getUsername(),getPassword());
}
好了,完美解释就这样结束了,还想再写点的~ 无奈,下次吧。
最后送上demo链接 https://github.com/zhairui/Try_mvp