Android中的MVP架构分解和实现.docx
- 文档编号:10782249
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:12
- 大小:183.37KB
Android中的MVP架构分解和实现.docx
《Android中的MVP架构分解和实现.docx》由会员分享,可在线阅读,更多相关《Android中的MVP架构分解和实现.docx(12页珍藏版)》请在冰点文库上搜索。
Android中的MVP架构分解和实现
Android中的MVP架构分解和实现
1、概述
传统的Android开发架构一般是MVC模式,
Model:
业务逻辑和实体模型
View:
对应于布局文件
Controllor:
对应于Activity
单独从逻辑看起来非常好,与我们做Web开发时,开发模式类似,但在实际开发中,View对应于布局文件,实际上关于该布局文件中的数据绑定的操作,事件处理的代码都在Activity中,Activity既像View又像Controller(MVVP架构中包括数据绑定),导致Activity中职责太重,耦合度大。
修改和维护起来非常麻烦。
MVP架构中,View对应于Activity,负责View的绘制以及与用户交互
Model依然是业务逻辑和实体模型,Presenter负责完成View于Model间的交互。
(1)Model层
模型层之中做的工作是具体业务逻辑处理的实现,都伴随着程序中各种数据的处理,复杂一些的就需要实现一个Interface来松耦合了。
(2)View层
视图层体现的很轻薄,负责显示数据、提供友好界面跟用户交互就行。
MVP下Activity和Fragment体现在了这一层,Activity一般也就做加载UI视图、设置监听再交由Presenter处理的一些工作,所以也就需要持有相应Presenter的引用。
处理一些基本UI逻辑,判断是否为空。
(3)Presenter层
Presenter这一层处理着程序各种逻辑的分发,收到View层UI上的反馈命令、定时命令、系统命令等指令后分发处理逻辑交由Model层做具体的业务操作。
MVP架构和MVC架构区别:
MVC中是允许Model和View进行交互的,而MVP中,Model与View之间的交互由Presenter完成。
还有一点就是Presenter与View之间的交互是通过接口的。
3、MVP实现
百说不如一做。
实现一个简单的登录操作。
项目结构如下:
(1)Model层实现
首先实现User实体类:
packagecom.chunsoft.blogcontent.bean;
/**
*Developer:
chunsofton2017/2/711:
19
*Email:
chun_soft@
*Content:
实体类
*/
publicclassUser{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
model层主要实现业务逻辑处理,在本文案例中,主要逻辑处理就是登录,抽取了一个接口和一个实现类,在login操作,模拟登录操作,Thread.sleep()模拟耗时,由于是耗时操作,通过一个回调接口通知登录状态。
model层接口:
packagecom.chunsoft.blogcontent.model;
importcom.chunsoft.blogcontent.RequestCallback;
importcom.chunsoft.blogcontent.bean.User;
/**
*Developer:
chunsofton2017/2/711:
30
*Email:
chun_soft@
*Content:
Model层主要处理业务方法和实体模型
*/
publicinterfaceLoginModel{
voidlogin(Stringusername,Stringpassword,RequestCallback
}
model层接口实现:
packagecom.chunsoft.blogcontent.model.impl;
importcom.chunsoft.blogcontent.RequestCallback;
importcom.chunsoft.blogcontent.bean.User;
importcom.chunsoft.blogcontent.model.LoginModel;
/**
*Developer:
chunsofton2017/2/711:
31
*Email:
chun_soft@
*Content:
Model层的实现
*/
publicclassLoginModelImplimplementsLoginModel{
@Override
publicvoidlogin(finalStringusername,finalStringpassword,finalRequestCallback
//模仿登录操作
newThread(){
@Override
publicvoidrun(){
try{
Thread.sleep(2*1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
if("chunsoft".equals(username)&&"123456".equals(password)){
Useruser=ewUser();
user.setUsername(username);
user.setPassword(password);
callback.onSuccess(user);
}else{
callback.onFailure("登录失败");
}
}
}.start();
}
}
回调接口:
packagecom.chunsoft.blogcontent;
/**
*Developer:
chunsofton2017/2/711:
35
*Email:
chun_soft@
*Content:
回调接口
*/
publicinterfaceRequestCallback
voidonSuccess(Tdatas);
voidonFailure(Stringmsg);
}
(2)View层实现
对于View层接口定义,首先考虑功能上的操作,然后考虑:
该操作需要什么?
(getUserName等)
该操作的结果,对应的反馈?
(toMainActivity等)
该操作过程中交互友好?
(showLoading)
view层接口:
packagecom.chunsoft.blogcontent.view;
importcom.chunsoft.blogcontent.bean.User;
/**
*Developer:
chunsofton2017/2/711:
54
*Email:
chun_soft@
*Content:
view层接口
*/
publicinterfaceLoginView{
StringgetUserName();
StringgetPassword();
voidshowLoading();
voidhideLoading();
voidtoMainActvity(Useruser);
voidshowFailedError(Stringmsg);
}
view层实现,其实就是Activity,可以看到Activity的代码量大大减少,且逻辑清晰:
packagecom.chunsoft.blogcontent;
importandroid.os.Bundle;
importandroid.support.v7.app.AppCompatActivity;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ProgressBar;
importandroid.widget.Toast;
importcom.chunsoft.blogcontent.bean.User;
importcom.chunsoft.blogcontent.presenter.impl.LoginPresenterImpl;
importcom.chunsoft.blogcontent.view.LoginView;
publicclassMainActivityextendsAppCompatActivityimplementsLoginView{
privateEditTextet_mobile,et_password;
privateProgressBarpb;
privateButtonbtn_login;
privateLoginPresenterImplmLoginPresenter=newLoginPresenterImpl(this);
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_mobile=(EditText)findViewById(R.id.et_mobile);
et_password=(EditText)findViewById(R.id.et_password);
pb=(ProgressBar)findViewById(R.id.pb);
btn_login=(Button)findViewById(R.id.btn_login);
btn_login.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
mLoginPresenter.login();
}
});
}
@Override
publicStringgetUserName(){
returnet_mobile.getText().toString();
}
@Override
publicStringgetPassword(){
returnet_password.getText().toString();
}
@Override
publicvoidshowLoading(){
pb.setVisibility(View.VISIBLE);
}
@Override
publicvoidhideLoading(){
pb.setVisibility(View.INVISIBLE);
}
@Override
publicvoidtoMainActvity(Useruser){
Toast.makeText(this,user.getUsername()+"登录成功",Toast.LENGTH_SHORT).show();
}
@Override
publicvoidshowFailedError(Stringmsg){
Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();
}
}
(3)Presenter层实现
Presenter层是Model层和View层的桥梁,本文中依然抽象出一个接口和一个实现类,定义时主要看该功能有什么操作,例如,登录:
Presenter接口:
packagecom.chunsoft.blogcontent.presenter;
/**
*Developer:
chunsofton2017/2/711:
49
*Email:
hun_soft@
*Content:
Presenter层接口
*/
publicinterfaceLoginPresenter{
voidlogin();
}
Presenter层实现:
packagecom.chunsoft.blogcontent.presenter.impl;
importandroid.os.Handler;
importcom.chunsoft.blogcontent.RequestCallback;
importcom.chunsoft.blogcontent.bean.User;
importcom.chunsoft.blogcontent.model.LoginModel;
importcom.chunsoft.blogcontent.model.impl.LoginModelImpl;
importcom.chunsoft.blogcontent.presenter.LoginPresenter;
importcom.chunsoft.blogcontent.view.LoginView;
/**
*Developer:
chunsofton2017/2/711:
50
*Email:
chun_soft@
*Content:
Presenter层实现
*/
publicclassLoginPresenterImplimplementsLoginPresenter{
privateLoginViewloginView;
privateLoginModelloginModel;
privateHandlermHandler=newHandler();
//在构造函数中初始化
publicLoginPresenterImpl(LoginViewloginView){
this.loginModel=newLoginModelImpl();
this.loginView=loginView;
}
@Override
publicvoidlogin(){
loginView.showLoading();
loginModel.login(loginView.getUserName(),loginView.getPassword(),newRequestCallback
@Override
publicvoidonSuccess(finalUserdatas){
//登录成功
mHandler.post(newRunnable(){
@Override
publicvoidrun(){
loginView.toMainActvity(datas);
loginView.hideLoading();
}
});
}
@Override
publicvoidonFailure(finalStringmsg){
//登录失败
mHandler.post(newRunnable(){
@Override
publicdrun(){
loginView.showFailedError(msg);
loginView.hideLoading();
}
});
}
});
}
}
Presenter层是Model层和View层的桥梁,Model层和View层不直接通信,所以Presenter层需要Model层和View层的实现类,从View层中获取重要参数,交给Model层调用业务逻辑处理,执行后的结果和反馈再交给View层去展示。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 中的 MVP 架构 分解 实现