Mvp模式简介

衍生于MVC 模式,降低了耦合性,避免了View(Activity/Fragment)承担了所有的责任,
分担了UI层的职责。

在MVP模式里通常包含4个要素:
* View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
* View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
* Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
* Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

为什么要使用 MVP模式

在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,
并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的 职责不断增加,
以致变得庞大臃肿。当我们将其中复杂的逻辑处理移至另外的一个类(Presneter)中时,Activity其实就是MVP模式中 View,
它负责UI元素的初始化,建立UI元素与Presenter的关联(Listener之类),同时自己也会处理一些简单的逻辑(复杂的逻辑交由
Presenter处理).

在实际的开发过程中,往往需求和界面是不确定的,随着开发的不断推进,原来的很多界面基本修改得面目全非,这是许多开发者面临
的一个非常头疼的问题,MVP在一定程度上了解决了这个问题。

##MVP 实战
(0)UserBean


public class User {private int  id;private String name ;private String mobile ;private String password;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + ", mobile=" + mobile + ", password=" + password + "]";}
}

(1)IUserModel 用户登录model接口
需要实现其接口,一般是读取网络数据,并存在JavaBean 中,并对javabean 有set和get的读写权限。

一般为了需要一个Listerner 来监听网络请求读写数据的情况。

 public interface IUserModel {// 用户登录接口public void login(String phone, String passwdMd5, final LoginHandler handler);}

(2)IUserLoginView 用户登录view 接口
根据需求,VIEw 需要对Model的bean数据进行操作,当登录成功,返回登录人信息情况。

 public interface IUserLoginView extends IUserView {public void onUserLoginSuccess(User user);public void onUserLoginError(String msg);
}

(3)IUserModel监听类

Model联网成功后,根据返回情况进行监听,它也起到了传递数据的作用,它将Model的数据传递给
Presenter ,从而Presenter 来讲数据传递给view


public interface LoginHandler extends NetworkHandler {public void onLoginSuccess(User user);       // 登录成功public void onLoginError(String msg);         // 登录失败
}

(4)UserPresenter

连接model 层和 view层,处理model和view进行交互。

 public class UserPresenter {private static final String TAG="UserPresenter";private IUserModel mUser;      private IUserView mView;       /*** 创建用户模型的主导器** @param view 如果不需要进行界面展示则View传入null*/public UserPresenter(@Nullable IUserView view) {mUser = UserModel.getInstance();mView = view;}public void login(String mobile,String password){mUser.login(mobile, password, new LoginHandler() {@Overridepublic void onlinkError(String msg) {if(mView!=null&&mView instanceof IUserLoginView)( (IUserLoginView) mView).onUserLoginError(msg);}@Overridepublic void onLoginSuccess(User u) {if (mView != null && mView instanceof IUserLoginView)((IUserLoginView) mView).onUserLoginSuccess(u);}@Overridepublic void onLoginError(String msg) {if(mView!=null&&mView instanceof IUserLoginView)((IUserLoginView)mView).onUserLoginError(msg);}});}}

(5)View 实现层

public class MainActivity extends Activity implements IUserLoginView{@ViewInject(id=R.id.btn_login,click="login") Button btn_login;@ViewInject(id=R.id.et_login_name)EditText et_login_name;@ViewInject(id=R.id.et_login_password) EditText et_login_password;private Context mContext;private UserPresenter userPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);FinalActivity.initInjectedView(this);mContext=this;userPresenter=new UserPresenter(this);}public void login(View v){String mobile=et_login_name.getText().toString();String password=et_login_password.getText().toString();String md5Pwd=MD5(password);userPresenter.login(mobile, md5Pwd);}@Overridepublic void onUserLoginSuccess(User user) {Toast.makeText(mContext, ""+user.toString(), Toast.LENGTH_SHORT).show();}@Overridepublic void onUserLoginError(String msg) {Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();} public final static String MD5(String plain) {  try {MessageDigest md5 = MessageDigest.getInstance("MD5");md5.update(plain.getBytes("UTF-8"));byte[] m = md5.digest();StringBuilder hex = new StringBuilder(m.length * 2);for (byte b : m) {if ((b & 0xFF) < 0x10) hex.append("0");hex.append(Integer.toHexString(b & 0xFF));}return hex.toString();} catch (Exception e) {e.printStackTrace();return null;}}
}

代码并不难,希望通过我这个例子,一是巩固自己的学习和理解,二是希望更多的人更好的学习,我会再接再厉,写
更多的博文。

源码下载

转载于:https://www.cnblogs.com/forezp/p/9852222.html

AndroidMVP相关推荐

  1. kotlin for android----------MVP模式下(OKHttp和 Retrofit+RxJava)网络请求的两种实现方式...

    2019独角兽企业重金招聘Python工程师标准>>> 今天要说的干货是:以Kotlin,在MVP模式下(OKHttp和 Retrofit+RxJava)网络请求两种实现方式的一个小 ...

  2. android mvp设计思想,Android-MVP设计模式(基础)

    MVP 全称:Model-View-Presenter MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,V ...

  3. android 录制mv框架,MVPro MVPro-简单的 AndroidMVP 框架 @codeKK Android开源站

    MVPro是一款 Android 上的 MVP 框架. MVPro的灵感来自 <一种在 android 中实现 MVP 模式的新思路> 和<用 MVP 架构开发 Android 应用 ...

  4. Android-MVP模式详解,附带学习经验

    前言 马爸爸总结了一句话:跳槽,要么是钱不到位,要么是受了委屈. 我给自己这次的跳槽经历做了一个分析,希望能对那些想换工作的朋友有所帮助. 许多朋友想换工作,但是对"换工作"的理解 ...

  5. android mvp模式弊端,《android-MVP模式的困惑》

    -------第一次写东西,写的不好,不好意思. 什么是MVP模式呢?我的理解就是老的MVC架构模式的一种延伸,能体现一种面向接口编程的思想.之所以会有MVP,是因为MVC中,C即Controllor ...

  6. Android-MVP模式详解,一篇文章帮你解答

    并发编程之线程的中止 万事万物有始就有终,当我们新启了一个线程后,线程自然也有结束的那一刻.一般来说,线程如果是run方法执行完成了,或者是抛出了一个未处理的异常导致线程提前结束,我们都称为线程的自然 ...

  7. Android-MVP模式详解,经典好文

    开头 眼看着金九银十就快来了,各大厂也开始了新一轮的招聘计划,尤其是腾讯前一段时间爆出了一个大消息: 将正式启动2021届秋季招聘,加大对数字经济和产业互联网人才的挖掘培养. 在本次招聘中,特别面向2 ...

  8. java 泛型解耦,T-MVP:泛型深度解耦下的MVP大瘦身

    QQ群:AndroidMVP 555343041 更新日志: 2017/1/31:AOP新增SysPermissionAspect支持动态申请系统权限切片,轻松适配6.0+ 2017/1/27:AOP ...

  9. 15类Android通用流行框架

    15类Android通用流行框架 Android流行框架 缓存 DiskLruCache Java实现基于LRU的磁盘缓存 图片加载 Android Universal Image Loader 一个 ...

最新文章

  1. Hadoop集群datanode磁盘不均衡的解决方案
  2. jqueryGannt用法
  3. js笔记(四)内置对象Math和Date()、浏览器对象模型BOM
  4. 使用Eclipse-Maven-git做Java开发(3)--Eclipse的安装和配
  5. python fetchall函数_关于python中的查询数据库内容中用到的fetchone()函数和fetchall()函数(转)还有fetchmany()...
  6. 视频解码芯片GM7150BC功能CVBS转BT656/601低功耗替代TVP5150
  7. 自适应增强算法Adaboost——前人栽树后人乘凉
  8. 用 JavaScript 实现一个 TicTacToe 游戏 —— 编程训练
  9. 硬件设计9---什么是示波器?
  10. (三)安装seafile服务器
  11. C++班车管理系统课程设计
  12. ffmpeg获取rtsp h265_用FFmpeg将rtsp视频流保存成H264、h265文件
  13. Java 对象的构造和初始化
  14. 逻辑回归python正则化 选择参数_SKlearn_逻辑回归小练习
  15. ZDNS发布国际标准IETF RFC 8897,网络根基安全升级迈出关键一步
  16. linux vc 调试方法,VC实现【API钩取】【调试法】附加调试器
  17. 能量守恒matlab,仿真动画软件设计作品--理想情况下能量守恒定律
  18. 天梯练习题(C语言版)
  19. 归档日志存在arch_oracle归档日志
  20. 一分钟告诉你DevOvs是什么

热门文章

  1. 防止病毒迷惑了您的眼睛
  2. 学习:MOSS2007 实现单点登陆(转)
  3. ConvMLP:你见过长得像CNN的MLP吗?UOUIUC提出了用于视觉任务的层次卷积MLP
  4. ACMMM 2021《LSG》性能SOTA!用GNN和GAN的方式来强化Video Captioning的学习!
  5. CVPR 2021 | 又好又快的视频异常检测,引入元学习的动态原型学习组件
  6. 腾讯优图刷新人体姿态估计国际权威榜单,相关论文被ECCV2020收录
  7. 从FairMOT到VoxelPose,揭秘微软以“人”为中心的最新视觉理解成果
  8. 百度大脑公开课:快速定制、部署高精度深度学习模型!
  9. 速度申请!2020年度腾讯犀牛鸟精英人才培养计划今日发布
  10. 最新《大规模机器学习》2020综述论文