带你一步一步认识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

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

一步一步将PlantUML类图导出为自定义格式的XMI文件

一步一步将PlantUML类图导出为自定义格式的XMI文件 说明: 首次发表日期:2024-09-08PlantUML官网: https://plantuml.com/zh/PlantUML命令行文档: https://plantuml.com/zh/command-line#6a26f548831e6a8cPlantUML XMI文档: https://plantuml.com/zh/xmi

2024年高教社杯数学建模国赛最后一步——结果检验-事关最终奖项

2024年国赛已经来到了最后一天,有必要去给大家讲解一下,我们不需要过多的去关注模型的结果,因为模型的结果的分值设定项最多不到20分。但是如果大家真的非常关注的话,那有必要给大家讲解一下论文结果相关的问题。很多的论文,上至国赛优秀论文下至不获奖的论文并不是所有的论文都可以进行完整的复现求解,大部分数模论文都为存在一个灰色地带。         白色地带即认为所有的代码均可运行、公开

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么? HTML是什么? 如何运行HTML文件? 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关  项目合作管理相关  后话 前言 本系列的博客将分享前端HTML的相关知识点。 本篇作为本系列的第一期博客,主要讲解H

认识鬼火引擎

一、Irrlicht简介 (1)概念Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台)、OpenGL 或它自己的软件着色程序,可以实现该引的完​全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(

PMP–一、二、三模–分类–14.敏捷–技巧–原型MVP

文章目录 技巧一模14.敏捷--原型法--项目生命周期--迭代型生命周期,通过连续的原型或概念验证来改进产品或成果。每个新的原型都能带来新的干系人新的反馈和团队见解。题目中明确提到需要反馈,因此原型法比较好用。23、 [单选] 一个敏捷团队的任务是开发一款机器人。项目经理希望确保在机器人被实际建造之前,团队能够收到关于需求的早期反馈并相应地调整设计。项目经理应该使用以下哪一项来实现这个目标?

Jenkins--pipeline认识及与RF文件的结合应用

什么是pipeline? Pipeline,就是可运行在Jenkins上的工作流框架,将原本独立运行的单个或多个节点任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。 为什么要使用pipeline? 1.流程可视化显示 2.可自定义流程任务 3.所有步骤代码化实现 如何使用pipeline 首先需要安装pipeline插件: 流水线有声明式和脚本式的流水线语法 流水线结构介绍 Node: