带你一步一步认识MVP -step1

2024-05-29 00:32
文章标签 认识 mvp 一步 step1

本文主要是介绍带你一步一步认识MVP -step1,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近换了一家公司项目用的架构是MVP之前一直在用MVVM,也用过一段时间MVP,在这里我还是分享下我对mvp的认识,希望这篇博客能帮助到想用mvp的小伙伴们。
为了让大家了解MVP的演变过程我这里先从最简单的来。
1.最简单的MVP
为了节约大家学习成本我这里就将复杂逻辑简单化处理了
首先使我们的model层的处理(这个过程可以使网络请求也可以是数据库查询处理)

public class UserInfoModel {public List<UserInfo> getUserInfo() {List<UserInfo> userInfos = new ArrayList<>();userInfos.add(new UserInfo("a", "1"));userInfos.add(new UserInfo("b", "2"));userInfos.add(new UserInfo("c", "3"));return userInfos;}
}

然后是我们的view层的处理这里我们采用接口形式记录了数据查询的各个状态

public interface UserInfoView {void onLoading();   // 1.正在加载中void onError(); // 2.获取出错了void onSucceed(List<UserInfo> userInfo);  // 3.成功了要显示数据
}

之后要处理我们的presenter层了也就是我们的P层

/*** Created by PC-304 on 2018/5/8.* 最简单的MVP*/
public class UserInfoPresenter {private UserInfoModel model;private UserInfoView view;public UserInfoPresenter(UserInfoView view) {this.view = view;model = new UserInfoModel();}public void getDate() {try {List<UserInfo> userInfos = model.getUserInfo();view.onSucceed(userInfos);} catch (Exception e) {view.onError();}}
}

在这里我们的P层的职责主要是
1.调用model层的处理取到数据( List userInfos = model.getUserInfo();
2.将处理后的结果返回view层的接口(view.onSucceed(userInfos);
最后是activity层的调用

public class MainActivity extends AppCompatActivity implements UserInfoView {private UserInfoPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);presenter = new UserInfoPresenter(this);presenter.getDate();}@Overridepublic void onLoading() {}@Overridepublic void onError() {//todo 错误提示}@Overridepublic void onSucceed(List<UserInfo> userInfo) {//todo  显示数据列表int count = userInfo.size();}
}

这样的话我们就实现了简单的mvp,mvp最主要的作用即实现了model跟view的隔离,相比较于mvc我们的控制层presenter层不再是将model处理的结果直接塞给我们的view,而是通过接口的回调处理让回调的接口去处理view的操作,在很大程度上减小了activity的负荷同时实现了m层跟v层的隔离,但这样写也是有问题的。

主要问题:在activity结束后如果model层的处理还没结束,当model层的处理结束后再调用view的处理,可能会有空指针异常。
接下来我们就处理这个问题。
首先还是model 层的处理(跟以前一样这里不需要额外处理)

public class UserInfoModel {public List<UserInfo> getUserInfo() {List<UserInfo> userInfos = new ArrayList<>();userInfos.add(new UserInfo("a", "1"));userInfos.add(new UserInfo("b", "2"));userInfos.add(new UserInfo("c", "3"));return userInfos;}
}

view层的处理(也跟以前一样不需要额外处理)

public interface UserInfoView {void onLoading();   // 1.正在加载中void onError(); // 2.获取出错了void onSucceed(List<UserInfo> userInfo);  // 3.成功了要显示数据
}

presenter层处理

public class UserInfoPresenter {private UserInfoModel model;private UserInfoView view;public UserInfoPresenter() {model = new UserInfoModel();}public void attach(UserInfoView view) {this.view = view;}public void detach() {this.view = null;}public void getDate() {try {List<UserInfo> userInfos = model.getUserInfo();if (view == null) return;view.onSucceed(userInfos);} catch (Exception e) {view.onError();}}
}

于以前相比
1.多了 attach 和 detach两个方法用于绑定view和解绑view
2.在getDate方法中添加了if (view == null) return;判断有效的防止了空指针
最后是我们的activity层的处理

public class MainActivity extends AppCompatActivity implements UserInfoView {private UserInfoPresenter presenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);presenter = new UserInfoPresenter();presenter.attach(this);presenter.getDate();}@Overridepublic void onLoading() {}@Overridepublic void onError() {//todo 错误提示}@Overridepublic void onSucceed(List<UserInfo> userInfo) {//todo  显示数据列表int count = userInfo.size();}@Overrideprotected void onDestroy() {super.onDestroy();presenter.detach();}
}

与以前相比在onDestroy方法中我们添加了presenter.detach()方法这样在activity结束的时候能有效的解绑view,同时在prestnter层中我们添加了对view的非空校验这样在activity结束后如果model有耗时的操作还没处理完我们这里在调用过程中不会有空指针异常。
总结一下
好处
1.在activity销毁的时候 detach防治调用报空指针等错误 相比最初的更安全些
问题
1. 很多代码是公用反复的,attach detach 每个 Presenter 都要有
2. Activity -> View 的 attach detach 每个 View 层也要有
3.可能有内存泄漏风向(我们的attach传入的view是this)

由于篇幅的影响为了让大家看起来不那么累我就在下一篇博客中介绍怎么解决这些问题。
带你一步一步认识MVP -step2

这篇关于带你一步一步认识MVP -step1的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012130

相关文章

认识LangChain

介绍 LangChain 是一个用于开发由大型语言模型(LLM)支持的应用程序的框架。LangChain使得构建LLM应用更简单,大致三个阶段: 开发阶段 Conceptual guide | 🦜️🔗 LangChainProviders | 🦜️🔗 LangChainTemplates | 🦜️🔗 LangChain使用LangChain的开源构建块和组件构建您的应用程序。使

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

ARC学习(3)基本编程模型认识(三)

笔者来介绍arc的编程模型的中断流程和异常流程 1、中断介绍 主要介绍一下中断进入的流程,包括需要配置的寄存器等信息。 中断号:16-255,总共240个中断。触发类型:脉冲或者电平触发中断优先级:16个,0最大,15最小。中断向量表地址:地址0x400对齐,因为中断+异常的地址总共大小占用0x400的字节中断向量大小:32位 1.1 中断配置流程 配置全局优先级阈值,STATUS

redis初步认识(一)

文章目录 概述安装编译 string数据结构基础命令应用对象存储累加器 list结构基础命令应用栈(先进后出FILO)队列 HASH基础命令存储结构应用存储对象 小结 概述 redis 是一个远程字典服务;当然,redis是内存数据库,kv数据库,最基础的数据结构有(string, list, hash, set, zset)几种。 安装编译 在ubuntu云服务器上安

HTML:认识img标签,为网页插入图片

认识<img>标签,为网页插入图片 在网页的制作中为使网页炫丽美观,肯定是缺少不了图片,可以使用<img>标签来插入图片。 语法: <img src="图片地址" alt="下载失败时的替换文本" title = "提示文本"> 举例: <img src = "myimage.gif" alt = "My Image" title = "My Image" /> 讲解: 1、src:

【Hadoop学习笔记】认识Hadoop

认识Hadoop 从网上找的课程做的笔记,有些图是自己理解画的,可能不正确,可以作为参考,有疑问的地方请直接指出,共同交流。 Hadoop是由Apache基金会开发的一个分布式系统基础架构,主要解决海量数据的存储和海量数据的分析计算问题。 Hadoop发展历史 创始人:Doug Cutting 开发原由:实现与Google类似的全文搜索功能,在Lucene框架基础上进行优化升级,查

[每周一更]-(第102期):认识相机格式Exif

文章目录 EXIF数据包含的信息读取EXIF数据的工具和库EXIF数据读取示例(Go语言)想法参考 相机拍摄的照片,在照片展示行无水印信息,但是照片属性中会包含比较丰富的信息,相机品牌、型号、镜头信息等,这些我们就可以利用起来, 采用程序形式来进行构造属于自己的水印,市面上常见的水印相机是类似流程,那么我们就看看什么是Exif 可交换图像文件格式(英语:Exchan

扩展7-zip右键,一步实现tar.gz的压缩

扩展7-zip右键,一步实现tar.gz的压缩 windows平台下如果要打包并压缩成linux的tar.gz格式,有2种方式: 使用Cygwin工具 这个工具可以在windows下实现linux的大部分功能,但是安装包很大,并且运行起来占系统资源。 使用7-zip工具 相比于Cygwin,此工具要轻量的多,但是7-zip工具并没有提供像linux下面可以一步执行的操作,需要2步操作才能完成。

Dragger2与MVP与Retrofit实战

1:MVP模块 1.1:MVP与MVC区别,有何应用场景1.2如何写mvp2:dragger2框架 2.1:为什么要用dragger2?2.2:深入解析dragger2?2.3:dragger2的使用3:retrofit的使用 MVP模块 MVP与MVC区别,有何应用场景       在我们传统的mvc开发中经常会遇到M(javabean),V(layout,activity),C(acti