mvc与mvp

mvc

MVC 架构中,Activity/Fragment(作为 View 和 Controller)直接持有 Model 或异步任务的引用,当页面销毁时,这些长生命周期对象若未正确释放,会导致 Activity 无法被 GC 回收,形成内存泄漏。

举例:

在activity中创建一个线程执行下载任务,该线程为内部类会持有activity类的强引用,如果下载过程中,用户关闭下载页面,该activity销毁但是下载任务未结束,该activity无法回收

// MVC模式下的Activity(同时作为View和Controller)
public class HomeActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);// 错误示例:AsyncTask内部类隐式持有Activity引用new DownloadTask().execute("url");}// 内部类会隐式持有外部类(Activity)的强引用private class DownloadTask extends AsyncTask<String, Void, byte[]> {@Overrideprotected byte[] doInBackground(String... params) {// 网络请求,耗时操作return downloadData(params[0]);}@Overrideprotected void onPostExecute(byte[] result) {// 更新UI(View层操作)TextView textView = findViewById(R.id.result_text);textView.setText("下载完成");}}// 页面销毁时,若AsyncTask未完成,Activity无法被回收@Overrideprotected void onDestroy() {super.onDestroy();// 未取消任务,泄漏风险}
}

mvp

**对比mvc:

把原来的UI逻辑抽象成View接口,把原来的业务逻辑抽象成Presenter接口,model还是原来的model

基本业务逻辑示例

在这里插入图片描述

示例

view: 定义展示的方法,依赖具体的activity实现

//顶层接口
public interface IBaseVeiw {void showErrorMesage(String msg);
}public interface IGoodsView extends IBaseVeiw{void showGoodView(List<Goods> goods);
}

model:存储和获取数据的逻辑,与view没有直接联系

//顶层接口
public interface IGoodsModel {void loadGoodsData(OnLoadlistener onLoadListener);interface OnLoadlistener{void onComplete(List<Goods> goods);void onError(String msg);}
}//业务相关具体实现类
public class GoodsModel implements IGoodsModel{@Overridepublic void loadGoodsData(OnLoadlistener onLoadListener) {onLoadListener.onComplete(getData());}//数据应来自真实情况(网络,数据库..  )private List<Goods> getData() {ArrayList data = new ArrayList<>();for(int i=0;i<10;i++){data.add(new Goods("商品"+i,i));}return data;}}

presenter:获取view和model,将model的获取的数据用view的方法显示

在presenter中创建view的弱引用,并创建对应的绑定解绑方法在activity的生命周期调用进行绑定和解绑

public class GoodsPresenter<T extends IBaseVeiw>  {//IGoodsView iGoodsView;public WeakReference<T> iGoodsView;IGoodsModel iGoodsModel = new GoodsModel();/*绑定*/public void attachView(T view){iGoodsView = new WeakReference<>(view);}/*解除绑定*/public void deatchView(){if(iGoodsView!=null){iGoodsView.clear();iGoodsView = null;}}public void  fetch(){if(iGoodsView.get()!=null&&iGoodsModel!=null){iGoodsModel.loadGoodsData(new IGoodsModel.OnLoadlistener() {@Overridepublic void onComplete(List<Goods> goods) {((IGoodsView)iGoodsView.get()).showGoodView(goods);}@Overridepublic void onError(String msg) {}});}}
}

在activity中使用presenter,只关心两件事,数据从哪里来,表示层选择什么

public class MainActivity extends AppCompatActivity implements IGoodsView {private ActivityMainBinding binding;private MainAdapter mainAdapter;private GoodsPresenter goodsPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());mainAdapter = new MainAdapter(R.layout.item_book);goodsPresenter = new GoodsPresenter();//使用弱引用goodsPresenter.attachView(this);goodsPresenter.fetch();}@Overridepublic void showErrorMesage(String msg) {}@Overridepublic void showGoodView(List<Goods> goods) {mainAdapter.setNewInstance(goods);binding.rec.setAdapter(mainAdapter);}@Overrideprotected void onDestroy() {super.onDestroy();goodsPresenter.deatchView();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商业智能中的地图可视化模板:助力数据高效呈现

引言 在数字化浪潮席卷的当下&#xff0c;数据可视化的重要性愈发凸显。企业和组织需要从海量的数据中提取有价值的信息&#xff0c;以便做出明智的决策。而可视化地图组件作为数据可视化的关键部分&#xff0c;能够将数据与地理位置相结合&#xff0c;以直观、美观的方式展示…

Opencv 相机标定相关API及原理介绍

Opencv 相机标定相关API及原理介绍 相机标定是计算机视觉中的基础任务,旨在确定相机的​​内参矩阵​​、​​畸变系数​​以及(可选)​​外参​​(相机相对于世界坐标系的旋转和平移)。OpenCV提供了完整的相机标定工具链,核心函数为cv2.calibrateCamera,其原理基于张正…

深入剖析AI大模型:Prompt 从理论框架到复杂任务的全场景实现

今天我们就Prompt实战&#xff0c;实现一下复杂场景&#xff0c;通过这些实战我们就可以更好的理解大模型工作的原理和机制了。我个人觉得Prompt是AI大模型中非常重要的的环节。首先我们还是温习一下Prompt的框架和基础原则。然后我们就文本生成、问答任务及复杂任务三个方面分…

Fractal Generative Models论文阅读笔记与代码分析

何恺明分型模型这篇文章在二月底上传到arXiv预出版网站到现在已经过了三个月&#xff0c;当时我也听说这篇文章时感觉是大有可为&#xff0c;但是几个月不知道忙啥了&#xff0c;可能错过很多机会&#xff0c;但是亡羊补牢嘛&#xff0c;而且截至目前&#xff0c;该文章应该也还…

IntelliJ IDEA代码提示忽略大小写设置详解

目录 前言一、设置步骤1. 打开设置界面2. 进入代码补全设置3. 配置大小写敏感选项新版本&#xff08;2023及以上&#xff09;旧版本&#xff08;2022及以下&#xff09; 4. 保存并应用设置 二、效果验证示例三、注意事项与常见问题1. **适用范围**2. **版本兼容性**3. **设置未…

Oracle集群OCR磁盘组掉盘问题处理

问题描述 填写问题的基础信息。 系统名称 - IP地址 - 操作系统 HP-UNIX 数据库 Oracle 11.2.0.4 两节点RAC 症状表现 问题的症状表现如下 集群的OCR磁盘组掉了一块盘(/dev/rdisk/disk52): 查询集群仲裁盘发现只有两块&#xff08;原来是有三块&#xff09;&#xff…

在WordPress中彻底关闭生成缩略图的方法

在WordPress中彻底关闭生成缩略图有多种方法&#xff0c;以下是几种常见的方法&#xff1a; 方法一&#xff1a;通过修改主题的functions.php文件 登录WordPress后台&#xff1a;进入WordPress后台管理界面。 编辑主题文件&#xff1a; 在左侧菜单中找到“外观”选项&#…

安全-Linux基线核查项点

Linux基线加固/整改 1.限制超级管理员远程登录 修改远程管理程序ssh的配置文件 vi /etc/ssh/sshd_config PermitRootLogin no 重启sshd服务 systemctl restart sshd 2. 修改默认密码生存周期 一个好的密码时间策略如下&#xff1a; vi /etc/login.defs PASS_MAX_DAY 90 最长…

在微信小程序中使用骨架屏

在微信小程序中使用骨架屏可以优化用户体验&#xff0c;避免页面加载时出现白屏现象。以下是详细的使用方法和注意事项&#xff1a; 使用方法 生成骨架屏代码&#xff1a; 打开微信开发者工具&#xff0c;进入需要添加骨架屏的页面。在模拟器面板右下角点击三个点&#xff0c…

网络的那些事——初级——OSPF(1)

&#x1f48e;什么是OSPF? OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一种基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;广泛应用于中大型企业及运营商网络。其核心设计目标是解决早期协议&#xff08;如RI…

前端导出PDF(适配ios Safari浏览器)

目前市面上常用的前端导出PDF库组合一般为&#xff1a; 1. html2canvas js-pdf 2. html2canvaspdf-lib 3. domtoimagepdf-lib 因本人项目中导出pdf需求为导出30页及以上的多页pdf&#xff0c;考虑性能问题&#xff0c;选择了 html2canvaspdf-lib 及domtoimagepdf-lib两种方…

physicsnemo开源程序是开源深度学习框架,用于使用最先进的 Physics-ML 方法构建、训练和微调深度学习模型

​一、软件介绍 文末提供程序和源码下载 NVIDIA PhysicsNeMo 是一个开源深度学习框架&#xff0c;用于使用最先进的 SciML 方法构建、训练、微调和推理物理 AI 模型&#xff0c;以实现 AI4 科学和工程。PhysicsNeMo 提供 python 模块来构建可扩展和优化的训练和推理管道&#…

JDBC接口开发指南

1.简介 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;可以为多种关系数据库提供统一访问&#xff0c;它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准&#xff0c;据此可以构建更高级的工具…

Shell 脚本:系统管理与任务自动化的利器

在开发者忙碌的日常工作中&#xff0c;效率就是生命线。当面对大量重复、繁琐的系统管理任务与开发流程时&#xff0c;一款得力的编程工具能让工作事半功倍。Shell 脚本&#xff0c;这把在 Linux 和 Unix 系统环境下闪耀着光芒的利器&#xff0c;凭借其强大的自动化能力&#x…

关于mybatis插入大批量数据效率问题

一、即便分批次用mybatis插入数据&#xff0c;效率依旧不高&#xff0c;原因&#xff1a; MyBatis一次性批量插入几千条数据&#xff0c;为什么性能很差&#xff1f;-腾讯云开发者社区-腾讯云 文中提出&#xff1a; 默认执行器类型为Simple&#xff0c;会为每个语句创建一个新…

在 JavaScript中编写 Appium 测试(入门)

1.编写一个测试 (JS) 要在 JavaScript&#xff08;Node.js&#xff09;中编写 Appium 测试&#xff0c;我们需要选择一个与 Appium 兼容的客户端 库。维护最好的库和 Appium 团队推荐使用的库是 WebdriverIO, 所有就让我们使用它吧。既然我们已经安装了 Appium&#xff0c;我们…

【android bluetooth 框架分析 04】【bt-framework 层详解 6】【Properties介绍】

DeviceProperties、AdapterProperties、StorageModule、以及 bt_config.conf 是 AOSP Bluetooth 栈中 设备属性管理与持久化系统 的核心组成部分&#xff0c;它们之间关系紧密&#xff0c;但职责各有不同。 下面我将依次讲解它们的区别与联系. 注意: 在代码里面 还有 Blueto…

@Resource vs @Autowired 在Spring中的使用和区别

Resource vs Autowired 在Spring中的使用和区别 在Spring开发中&#xff0c;我们常会接触两个用于实现引用模块注入的注解&#xff1a;Resource 和 Autowired。它们在使用上有些相似之处&#xff0c;但本质上来看&#xff0c;有所区别。本文将给出两者的详细介绍和对比&#x…

Mac M4 芯片运行大模型指南,包括模型微调与推理

Mac M4 芯片运行大模型指南&#xff0c;模型微调与推理 背景模型推理 Ollama&#x1f50d; 举例说明&#xff1a;踩坑 模型微调 unsloth 背景 在国补、教育优惠、京东会员500优惠券等众多优惠之下。 我拿下了Macmini M4 16G 内存万兆网卡。在机器到手的第一时间&#xff0c;马…

微信小程序中安装vant

以下是微信小程序中安装 Vant 的详细步骤&#xff1a; 1. 初始化项目 在微信小程序项目目录下&#xff0c;打开终端&#xff0c;执行以下命令进行项目初始化&#xff1a; npm init -y该命令会快速生成一个默认的package.json文件&#xff0c;-y参数表示直接使用默认配置&…