最近android项目的框架设计大多数使用了MVP框架,这样可以减轻Activity,Fragment的代码量,使代码结构比较清晰,但是不同的程序员对MVP的理解不同,因此有多种写法,下面谈谈我对MVP的理解。
Model 层主要负责数据获取和处理,可以将一些复杂的业务逻辑处理代码放到这里来写,比如网络请求获取数据,从本地数据库读取数据等。View层主要是界面交互,结果展示等,一般是Activity和Fragment负责这一层,Presenter 我理解更像是一个中间层,作为View层和Model层的桥梁,其内部分别持有View 和 Model 的对象,用来处理逻辑。下面通过一个例子来具体说明一下。
代码实例就是一个简单的用户输入用户名和密码,之后通过验证跳转到下一页的功能,页面如下。
为了设计规范,都使用接口加实现的方式,首先介绍一下View层,定义一个接口ILoginView
void showProgress();//显示loading框
void hideProgress();//隐藏loading框
void setUsernameError();//处理用户名错误
void setPasswordError();//处理密码错误
几个接口函数都是负责交互显示的。LoginActivity实现接口中的函数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
/*新建Presenter负责处理逻辑*/
presenter = new BaseLoginPresenter(this,new LoginModelImpl());
}
@Override
public void showProgress() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
public void hideProgress() {
progressBar.setVisibility(View.GONE);
}
@Override
public void setUsernameError() {
username.setError(getString(R.string.username_error));
}
@Override
public void setPasswordError() {
password.setError(getString(R.string.password_error));
}
@Override
public void navigateToHome() {
startActivity(new Intent(this, ScrollLayoutActivity.class));
finish();
}
@Override
public void onClick(View v) {
presenter.validateCredentials(username.getText().toString(),
password.getText().toString());
}
Model 层也是先定义一个接口,将业务规范写进去,这里比较简单,只有一个Login函数,还有一个登陆成功的回调接口定义
/*登陆成功回调借口*/
interface OnLoginFinishedListener {
void onUsernameError();
void onPasswordError();
void onSuccess();
}
void login(String username, String password, ILoginModel.OnLoginFinishedListener listener);
实现代码如下:这里使用一个两秒延时模拟登陆请求
@Override
public void login(final String username, final String password, final
ILoginINteractor.OnLoginFinishedListener listener) {
new Handler().postDelayed(new Runnable() {
@Override public void run() {
if (TextUtils.isEmpty(username)) {
listener.onUsernameError();
return;
}
if (TextUtils.isEmpty(password)) {
listener.onPasswordError();
return;
}
listener.onSuccess();
}
}, 2000);
}
接下来就是核心类Presenter的实现,这里不需要设计接口,因为大部分业务逻辑都写在Model层,此类要实现Model层的回调函数即可
private ILoginView loginView; //持有ILoginView,View层对象
private ILoginModel loginModel ;//持有ILoginModel ,Model层对象
public BaseLoginPresenter(ILoginView loginView, ILoginModel loginModel ) {
super(loginView);
this.loginView = loginView;
this.loginModel = loginModel ;
}
@Override
public void onUsernameError() {
if (isViewAttached()) {
loginView.setUsernameError();
loginView.hideProgress();
}
}
@Override
public void onPasswordError() {
if (isViewAttached()) {
loginView.setPasswordError();
loginView.hideProgress();
}
}
@Override
public void onSuccess() {
if (isViewAttached()) {
loginView.navigateToHome();
}
}
/*登陆验证的实现*/
@Override
public void validateCredentials(String username, String password) {
if (isViewAttached()) {
loginView.showProgress();
}
/*调用Model层的login函数*/
loginModel.login(username, password, this);
}
到此,一个最简单的MVP实现的例子介绍完了,在今后的开发中,业务逻辑更加复杂时,可以考虑一个View层对应对个Model和多个Presenter,这样会使代码更加清晰,但是MVP框架会大大的增加代码量,所以程序员们可以根据自己的需要选择合适的框架进行开发。
谢谢!