MVP模式在项目中的使用
1.MVP模式的简介:
相对于mvc,mvp模式中p就是presenter的缩写,意思相当于主持人,它协调view和model的连接,view和model相当于是两个不认识的人,他们中间的中介就是presenter,p持有m和v两个的联系方式。view要处理页面就要要数据,就去找p,让p去拿数据。而p呢就会直接找m去要数据,m把数据给p,然后p拿着数据进行加工,然后给v有用的数据,来用于v的展示。这个过程很像我们通过中介找房子。中介有我们和出租房的联系方式,可以通过查询系统,获取到出租房的房源信息,然后给我们最后有用的信息,比如房屋价格,环境等。但是我们是和房东没有办法直接联系的。这就是mvp。而mvc的话v是可以持有model数据的,这就导致v可能会对model做数据修改。导致会掺杂一些业务逻辑。使得业务逻辑在m和c以及v中混杂到一起。这个典型的例子就是activity。既要控制显示,还要管理数据。非常混乱。而为了更好的分层,还有后续如果我换v和m都没有很大影响的话,我们就延伸出了mvp。就如那个中介,它可以换一套查询系统和房东信息,也可以换租户,但是实现的模式还是不变的。
2.MVP模式具体使用方法:
在项目中的使用:
我们通常需要以接口的形式来实现三者的关系,这样方便后续的扩展。
以登陆为例:
Model:
/**
* 描述:登录界面请求接口
* */ public interface LoginInteractor extends MvpInteractor { /** * 登录 * @param phone * @param pwd * @param loginInteractorListener */ void userLogin(String phone, String pwd, LoginInteractorListener loginInteractorListener); /** * 请求接口监听器 */ interface LoginInteractorListener { /** * 请求成功且业务代码 也成功 */ void succeed(); /** * 请求成功,但是业务代码失败 * @param message */ void failed(String message); /** * 请求失败 * * @param error */ void connectFail(String error); } }
View:
/** * 描述: * 作者:58 on 2016/5/11 10:41 */ public interface LoginView extends MvpView { /** * 登录成功view显示 */ void loginSucceed(); /** * 登录失败view显示 * @param message */ void loginFailed(String message);
void showNotice(String message);
/**
* 返回当前登录界面btn的状态
* @param canClick
*/
void isCanClick(boolean canClick);
void loadingDismiss();
}
void showNotice(String message);
Presenter:
/**
* 描述:登录界面逻辑控制器 */ public interface LoginPresenter extends MvpPresenter<LoginView> { /** * 登录 * @param phone * @param pwd */ void login(String phone, String pwd, String validcode); /** * 检测是否可以点击登录btn * @param userPhone * @param password */ void checkClickBtn(String userPhone, String password); }
public interface MvpPresenter<T extends MvpView> {
/** * 将MVP的View附加到Presenter */ void attachView(T view); void attachView(T view,ViewGroup rootView); void detachView(); }
具体的实现类如下:
/**
* 描述:登录界面逻辑控制器实现 */ public class LoginPresenterImpl implements LoginPresenter, LoginInteractor.LoginInteractorListener, GetPictureVerCodeInteractor.GetPictureVerCodeInteractorListener { private LoginView mLoginView; private Context mContext; private LoginInteractor mLoginInteractor; public LoginPresenterImpl(Context context) { mContext = context; mAccount = Account.getAccount(mContext); } @Override public void attachView(LoginView view) { mLoginView = view; mLoginInteractor = new LoginInteractorImpl(mContext); } @Override public void attachView(LoginView view, ViewGroup rootView) { } @Override public void detachView() { mLoginInteractor.cancelAllRequest(); mContext = null; mLoginView = null; } @Override public void login(String phone, String pwd, String validcode) { mLoginInteractor.userLogin(phone, pwd, this); } @Override public void checkClickBtn(String userPhone, String password) { boolean canClick = !userPhone.isEmpty() && userPhone.length() == 11 && !password.isEmpty() && password.length() >= 6; mLoginView.isCanClick(canClick); } @Override public void succeed() { mLoginInteractor.sendPPU(this); } @Override public void failed(String message) { mLoginView.loginFailed(message); } @Override public void connectFail(String error) { mLoginView.showNotice(error); } @Override public void requestFinish() { mLoginView.loadingDismiss(); } }
Model:
/**
* 描述:登录界面请求接口实现类 */ public class LoginInteractorImpl implements LoginInteractor { public Context mContext; public LoginInteractorImpl(Context context) { mContext = context; } @Override public void cancelRequest(String requestTag) { HttpManager.getHttpManagerBase(mContext).cancelRequest(requestTag); } @Override public void cancelAllRequest() { HttpManager.getHttpManagerBase(mContext).cancelRequest(ConstantConfig.LOGIN_TAG); mContext = null; } @Override public void userLogin(final String phone, final String pwd, final String validcode, final String vcodekey, final LoginInteractorListener loginInteractorListener) { final Map<String, String> map = setParams(phone, pwd, validcode, vcodekey); LogUtil.i("userlogin", map.toString()); String url = "http://test/login; //这里只做示例 HttpManager.getHttpManagerBase(mContext).httpPost(url, map, ConstantConfig.LOGIN_TAG, new RequestResultListener() { @Override public void onSuccess(String info, Object tag) { Log.e("--------------", info); Gson gson = new Gson(); LoginInfo loginInfo = gson.fromJson(info, LoginInfo.class); if (loginInfo != null) { loginInteractorListener.succeed(); } loginInteractorListener.requestFinish(); } @Override public void onFail(String code, String msg, String info, Object tag) { loginInteractorListener.failed(msg); loginInteractorListener.requestFinish(); } @Override public void connectFail(NetworkResponse error, Object tag) { LogUtil.i("wuba", "connectFail"); loginInteractorListener.connectFail("网络异常请重试"); loginInteractorListener.requestFinish(); } }); } }
我们可以让我们的Activity实现View的接口即可。如下
@Override
}
public class LoginActivity extends BaseActivity implements LoginView {
。。。。。此处隐去1000字public void loginSucceed() { ToastUtil.show(this, "登录成功"); if (mDialog != null) { dialogIsShow = false; mDialog.dismiss(); } loginIntent(); } @Override public void loginFailed(String message) { if (mDialog != null) { mDialog.dismiss(); dialogIsShow = false; } if (TextUtils.isEmpty(message)) { message = "登陆异常,请稍后重试!"; } ToastUtil.show(this, message); } @Override public void showNotice(String message) { ToastUtil.show(this, message); } @Override public void isCanClick(boolean canClick) { if (canClick) { loginLoginButton.setBackgroundResource(R.drawable.wb_login_btn_xml); loginLoginButton.setClickable(canClick); } else { loginLoginButton.setBackgroundResource(R.drawable.wb_unlogin_btn_xml); loginLoginButton.setClickable(canClick); } } @Override public void loadingDismiss() { qianguiAccountLoading.statusToNormal(); qianguiAccountLoading.setVisibility(View.GONE); }
以上的代码中删去了一部分和公司相关的字段和数据,只是给大家做一个示例,不要生搬硬套。v和m的书写完全看个人的业务需求。
当我们需要替换登陆页面,或者需要替换登陆方式时,这时就会发现我们只需要动View和model即可。p就可以完全保持不动。
如果大家有什么不理解的地方,也可以给我留言。
MVP模式在项目中的使用相关推荐
- 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~
写在前面 讲道理,这次是真的笔者很久都没有更新 blog 了,主要最近维护的框架问题也是层出不穷,而且对技术交流群的解答也让我身心疲惫,所以在这里跟关注我的人说声抱歉,没有定期给你们带来福利,那么这里 ...
- MVP模式在Android中的应用(附UML高清大图,使用RecyclerView举例)
传了一张图,图比较大,请移步下载:http://download.csdn.net/detail/u011064099/9266245 在看代码之前,首先简单看一下什么是MVP模式:http://ww ...
- JAVA调用接口简单封装,Mvp+Retrofit2+RxJava2 项目中使用的简洁封装
Retrofit2 + RxJava2 是一个强大的组合,完成一系列网络请求 MVP当前用的很多的一种框架,Model+View+Presenter 本文记录了作者在项目中对 Retrofit2 + ...
- 梦之鬼索MVP模式在Android中的设计和实现
想必大家都知道MVC和MVP,MVVM.今天就来探讨一下MVP在安卓中的设计和实现. 首先谈一个需求. 你的boss说,小明去给我写一个程序很简单我提供Person ID 你给我拿出Person的姓名 ...
- MVP模式在Android中的应用之图片展示选择功能的框架设计
前言:虽然安卓出现的时间比其它平台软件比较晚,但是在我们的安卓开发中,一样可以使用我们所熟知的设计模式来给它一个合理.完善的结构,这样,才可以使我们在平常开发的时候减少冗余代码的发生,真正的提高效率. ...
- 传统MVP用在项目中是真的方便还是累赘?
原文地址: http://www.jianshu.com/p/ac51c9b88af3 qq群:301733278 前言(最后奉上福利) 自从Google在去年放出MVP的官方Sample后,越来越多 ...
- Android 架构之路(4)责任链模式在项目中的实际使用
文章目录 前言 责任链模式定义 UML 类图: Demo 实现方式一: UML 类图: Demo 实现方式二: 项目实践 实现方式一: 实现方式二: 总结 前言 责任链模式(职责链模式)的运用在项目中 ...
- android mvp模式例子_Android中mvp模式使用实例详解
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示.作为一种新的模式,MVP与MVC有着一 ...
- 工厂模式 — 在项目中的用法
很多工程都是有pc端和mobile端的,并且这里的mobile端并不是指移动端适应的效果,而是专门为mobile端编写的. 所以这样一个页面就会用到两套页面代码(pc端和mobile端),例如imoo ...
- MVP模式在Android实际项目中的应用和优化
注:本文阅读需要对MVP模式有基本了解. MVP模式已经出现有很长一段时间了,但是火起来是这两年的事情. 关于MVP的概览,介绍,乃至于教程,Demo,实例,网上都有很多,我也有一篇文章专门收录了一些 ...
最新文章
- Mysql性能优化方案
- Guava包学习--EventBus
- php中的网络接口,php中的接口interface
- Linux Kernel中断下半部分实现的三种方式
- python 清屏_Python学前准备如果你知道要去哪,那么全世界都给你让路
- [MyBatisPlus]常用注解_@TableName_@TableId_@TableField_@TableLogic通过全局配置配置主键生成策略
- atitit. applet 浏览器插件 控件 的环境,开发,提示总结o9o
- webStrom破解链接
- sql取字段前4位_SQL学习之旅(7)
- 安装centos后 启动mysqld显示mysqld: 未被识别的服务 解决方法
- 2019测试学习路线图,内附完整自学路线+视频+工具
- kafka从入门到精通:马士兵java集合
- 翟菜花:为什么说社区会是虚拟偶像驶向未来的新航标?
- 中文论文检索证明怎么开_作者如何拿到论文检索证明
- 互联网公司裁员,中年失业找不到工作,大龄程序员的出路在哪里
- 分布式数据库原理解析
- 免费注册个体户营业执照出证教程
- 惠普战66键盘win10亮度调节快捷键失灵的解决办法
- 【Hibernate步步为营】--最后的集合映射
- 计算机科技兴趣小组活动总结,科技兴趣小组的活动总结