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

相关文章

认识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