Android进阶之路(2)-详解MVP
程序员文章站
2022-10-25 18:35:17
### MVP简介 >MVP 全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的[地方](https://baike.baidu.com/item/%E5%9C%B0%E6%96%B9/2262175):Controller/Present ......
### mvp简介
>mvp 全称:model-view-presenter ;mvp 是从经典的模式mvc演变而来,它们的基本思想有相通的[地方](https://baike.baidu.com/item/%e5%9c%b0%e6%96%b9/2262175):controller/presenter负责逻辑的处理,model提供数据,view负责显示。
对于mvc不了解的朋友可以查此文:
[android进阶之路(1)-详解mvc](https://www.jianshu.com/p/285f6a8d971f)
**android中的mvp:**
- m层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。和mvc类似
- v层:对应的activity,负责xml绘制与页面交互
- p层:负责view与model之间的交互
![](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219353-399431689.png)
### 为什么要用mvp
我们先想想上篇文章,我们讲到为什么要用mvc,当时我们总结了几点:
- 代码复用
- 耦合性低
- 方便维护的高等
然而我们在写mvc项目时候,也发现了一些问题:
1.对于android中的activity或者fragment ,我们不能很清晰的区分它是view还是controller,既有交互又有页面绘制,这就导致了activity和fragment很“庞大”
2.view与model确实是分离的,但是关联性太强,这就导致activity与model的联系强,这样我们只要改一点点代码, model 、view、activity 都会变,维护成本太高,view与model之前的耦合性太高。
而mvp最大的改变就是view与model实现完全隔离。view把操作意图给p层,p收到后,会调用model层来实现具体的逻辑, 逻辑实现后会再通知给p, p再通过view的接口回调给view。即便v和m更改了,也不会有影响,耦合性低。
### mvp demo
以登录模块为例,来实现mvp
**1.定义view接口- iloginview**
```
/**
* 获取view层的dialog
*
* @return retuen
*/
dialog getloaddialog();
/***
* 关闭view层的dialog
*/
void cancelloaddialog();
/**
* 获取手机号参数
*
* @return username
*/
string getphone();
/**
* 获取密码
*
* @return password
*/
string getcode();
/**
* 弹出消息
*
* @param msg msg
*/
void showmsg(string msg);
```
view接口大家都明白吧?就是你要告诉给p的意图。activity实现此接口。并调用p的方法:
```
@override
public void cancelloaddialog() {
if (dialog!=null&&dialog.isshowing()){
dialog.dismiss();
}
}
@override
public string getphone() {
return edphone.gettext().tostring();
}
@override
public string getcode() {
return edcode.gettext().tostring();
}
@override
public void showmsg(string msg) {
toast.maketext(getapplicationcontext(),msg,toast.length_short).show();
}
```
```
mpresenter.login();
```
**2.定义model与modelimpl**
model:
```
public interface iloginmodel {
void login(string phone, string code, onloaddataslistener onloaddataslistener);
}
```
modelimpl :
```
@override
public void login(string phone, string code, final onloaddataslistener onloaddataslistener) {
//填写具体的操作逻辑与onloaddataslistener回调
}
```
model实现类逻辑处理完成之后会通知给p,定义p:
```
/**
* 登陆
*/
public void login() {
if (mview == null) return;
if (textutils.isempty(mview.getphone()) || textutils.isempty(mview.getcode())) {
mview.showmsg("手机号或密码不能为空");
return;
}
mview.getloaddialog().show();
loginmodel.login(mview.getphone(), mview.getcode(), new onloaddataslistener() {
@override
public void onsuccess(currencybean.databean databean) {
gson gson=new gson();
mview.cancelloaddialog();
log.e("qzs---- ",gson.tojson(databean)+"");
mview.loginsuccess();
}
@override
public void onfailure(string error) {
mview.cancelloaddialog();
mview.loginfail();
}
});
}
```
p通过view接口返回给view
另外mvp也是有缺点的:
- 增加代码的复杂度
- 实现难度增加
- 如果某特定视图的渲染很多(activity),就会造成presenter与该视图联系过于紧密,一旦该视图需要变更,那么presenter也需要变更了,不能如预期的那样降低耦合度和增加复用性。
大家可以关注我的微信公众号:「秦子帅」一个有质量、有态度的公众号!
![公众号](https://img2018.cnblogs.com/blog/1312938/201909/1312938-20190901084219519-1281896463.jpg)
上一篇: C#设置输入法实例分析