带你一步一步认识MVP -step3

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

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

经过上一篇博客的介绍 带你一步一步认识MVP -step2
接下来我们就来解决上一篇博客遇到的问题
首先还是先来我们的base类
我们来看basemodel类这个类就是个空壳没什么逻辑处理

/*** Created by PC-304 on 2018/5/8.* model的base类*/
public class BaseModel {
}

接下来是baseView类跟以前一样

public interface BaseView {
}

下面是我们的basepresenter类跟以前不太一样了

/*** Created by PC-304 on 2018/5/8.* Presenter的Base类*/
public class BasePresenter<V extends BaseView, M extends BaseModel> {private WeakReference<V> mView;private M mModel; // 动态创建的 model 的对象@SuppressWarnings("unchecked")public void attach(WeakReference<V> mView) {this.mView = mView;// 最好要判断一下类型Type[] params = ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments();try {mModel = (M) ((Class) params[1]).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}//内存泄漏解决public void detach() {if (mView == null) return;this.mView.clear();this.mView = null;}//获取view对象public V getView() {if (mView == null) return null;return mView.get();}//获取model对象public M getModel() {return mModel;}
}

这里我们的prestnter持有了model的对象并在attach处理中给其初始化这里还需要注意的是我们的view已经不再是之前的view了而是添加WeakReference的view这样的话在activity销毁的时候我们的view得以正常销毁了。
在下面是我们的activity的处理

public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements BaseView {private P mPresenter;@SuppressWarnings("unchecked")@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView();// 创建 P,创建只能交给 子类,每个 Activity 都不一样mPresenter = createPresenter();if (mPresenter != null) {//天价处理可能在使用过程中不适用MVPmPresenter.attach(new WeakReference(this));}initView();initData();}// 由子类去实现创建protected abstract P createPresenter();protected abstract void initData();protected abstract void initView();//或者实现給view的id调用setContentView方法protected abstract void setContentView();@Overridepublic void onDestroy() {super.onDestroy();if (mPresenter==null) return;mPresenter.detach();}public P getPresenter() {return mPresenter;}
}

跟前面的处理几乎一致唯一不同的在下面(如果不使用mvp这里也不会报错了)

 if (mPresenter != null) {//天价处理可能在使用过程中不适用MVPmPresenter.attach(new WeakReference(this));}

最后就是基于这些基类的处理了
首先还是model类

public class UserInfoModel extends BaseModel{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 extends BaseView {void onLoading();   // 1.正在加载中void onError(); // 2.获取出错了void onSucceed(List<UserInfo> userInfo);  // 3.成功了要显示数据
}

然后是presenter类

/*** Created by PC-304 on 2018/5/8.* MVP 进阶* 好处  1.在activity销毁的时候 detach防治调用报空指针等错误 相比最初的更安全些* 解决  1. 很多代码是公用反复的,attach detach 每个 Presenter 都要有* 2. Activity -> View 的 attach detach 每个 View 层也要有* 问题  1.内存泄漏风险  解决* 2.model初始化不够简单 解决*/
public class UserInfoPresenter extends BasePresenter<UserInfoView, UserInfoModel> {public void getDate() {try {List<UserInfo> userInfos = getModel().getUserInfo();if (getView() == null) return;getView().onSucceed(userInfos);} catch (Exception e) {getView().onError();}}
}

最后是我们的activity的调用

public class MainActivity extends BaseMvpActivity<UserInfoPresenter> implements UserInfoView {@Overrideprotected UserInfoPresenter createPresenter() {return new UserInfoPresenter();}@Overrideprotected void initData() {getPresenter().getDate();}@Overrideprotected void initView() {setContentView(R.layout.activity_main);}@Overrideprotected void setContentView() {}@Overridepublic void onLoading() {}@Overridepublic void onError() {//todo 错误提示}@Overridepublic void onSucceed(List<UserInfo> userInfo) {//todo  显示数据列表int count = userInfo.size();}}

是不是很简单,希望这些能帮助到你们。

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



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

相关文章

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: