Android 开发过程中常见的内存泄漏场景分析

场景1 Static变量存储上下文环境Context

public class ClassName {// 定义1个静态变量private static Context mContext;//...
// 引用的是Activity的contextmContext = context; // 当Activity需销毁时,由于mContext = 静态 & 生命周期 = 应用程序的生命周期,故 Activity无法被回收,从而出现内存泄露}

结论:

被static修饰的变量生命周期==应用的生命周期,所以当前的mContext变量一旦赋值了activity的上下文环境,就会导致在activity需要销毁时,发现还有强引用mContext在持有该activity,所以无法正常回收掉该activity

解决方案
被static修饰的Context在赋值的时候可以把Application的Context赋值给mContext,这时就不会出现内存泄漏。因为应用的上下文和mContext引用的上下文生命周期一致。

场景2 单例模式

public class SingleInstance {private static SingleInstance instance;private Context mContext;private SingleInstance(Context context) {this.mContext = context;}public static SingleInstance getInstance(Context context){if (instance == null){instance = new SingleInstance(context);}return instance;}
}

结论:

上述代码会存在内存泄漏

原因:

instance对象被static修饰后,该变量的生命周期=应用生命周期,导致该实例所持有的成员变量mContext无法被释放,如果用户传递的Context为Activity的上下文环境,就会导致该activity需要销毁的时候,发现自己的上下文环境还在被这个单例类持有并且设置了强引用,所以无法正常释放并销毁。从而导致内存泄漏

解决方案:

在构造器中通过上下文环境获取应用的上下文环境,赋值给自己的成员变量 mContext,这样该类中的上下文环境的生命周期就和应用的生命周期相等,从而不会出现内存泄漏的情况

  private SingleInstance(Context context) {this.mContext = context.getApplicationContext();}

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

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

相关文章

数字化转型导师坚鹏:科技金融政策、案例及营销创新

科技金融政策、案例及营销创新 课程背景: 很多银行存在以下问题: 不清楚科技金融有哪些利好的政策? 不知道科技金融有哪些成功的案例? 不知道科技金融如何进行营销创新? 课程特色: 以案例的方式解…

【重温设计模式】迭代器模式及其Java示例

迭代器模式的介绍 在编程领域,迭代器模式是一种常见的设计模式,它提供了一种方法,使得我们可以顺序访问一个集合对象中的各个元素,而又无需暴露该对象的内部表示。你可以把它想象成一本书,你不需要知道这本书是怎么印…

VLC播放器快捷键大全(史诗级最全)

文章目录 前言 a.倍速播放 b.快进快退 c.播放暂停 d.音量调节 e.跳到指定时间 f.画幅比例 缩放 裁剪 全屏 g.状态栏显示 h.截屏 录制 i.打开 保存 截屏 转化 四、总结 前…

vue+nodejs超市购物商城在线选品系统wtk87

在此基础上,结合现有超市货品信息管理体系的特点,运用新技术,构建了以 vue为基础的超市货品信息管理信息化管理体系。首先,以需求为依据,根据需求分析结果进行了系统的设计,并将其划分为管理员和用户二种角…

章六、集合(1)—— Set 接口及实现类、集合迭代、Map 接口、Collections类

一、 Set 接口及实现类 Set接口不能存储重复元素 Set接口继承了Collection接口。Set中所存储的元素是不重复的,但是是无序的, Set中的元素是没有索引的 Set接口有两个实现类: ● HashSet :HashSet类中的元素不能重复 ● TreeSet :可以给Set集…

python(5)之处理数组

上次代码结果如下: 1、处理数组的缺失值 1、isnan()函数 isnan()函数是Numpy模块里的一个可以标记数组中缺失值的位置 代码示例如下: import numpy as np ac np.array([1,2,3,2,3,4,5,9,np.nan,1]) p…

系统分析与设计(一)

我们有这么多各式各样的工具,互联网给我们带来了这么多用户和数据,这是好事也有副作用。 世界上能访问用户数据,并根据数据做分析和改进的公司,大概Google是其中翘楚,这种 data-centric 的做法做过了头,也有悲剧发生: Douglas Bowman 曾经是Google 的视觉设计主管,2009年的一天…

设计模式:观察者模式 ⑧

一、思想 观察者模式是一种常见的设计模式,也称作发布-订阅模式。它主要解决了对象之间的通知依赖关系问题。在这种模式中,一个对象(称作Subject)维护着一个对象列表,这些对象(称作Observers)都…

Docker完整版(一)

Docker完整版(一) 一、Docker概述1.1、Docker简介1.2、Docker的用途1.3、容器与虚拟机的区别1.4、Docker系统架构1.5、Docker仓库 二、Docker引擎2.1、Docker引擎架构2.2、Docker引擎分类2.3、Docker引擎的安装2.4、Docker镜像加速器 三、Docker镜像3.1、…

新概念英语第二册(76)

【New words and expressions】生词和短语(15) fool n. 傻瓜 bulletin n. 新闻简报 announcer n. (电视、电台)播音员 macaroni n. …

线程-创建线程的方法、线程池

1.创建线程一共有哪几种方法? 继承Thread类创建线程 继承Thread类,重写run()方法,在main()函数中调用子类的strat()方法 实现Runnable接口创建线程 先创建实现Runnable接口的类,重写run()方法,创建类的实例对象&#…

kibana配置 dashbord,做可视化展示

一、环境介绍 这里我使用的kibana版本为7.17版本。 语言选择为中文。 需要已经有es,已经有kibana,并且都能正常访问。 二、背景介绍 kibana的可视化界面,可以配置很多监控统计界面。非常方便,做数据的可视化展示。 这篇文章&…

Java面试题(主要分清区别!!!)

RequestBody和ResponseBody的区别? RequestBody:接收json或xml数据 ResponseBody的:返回json或xml数据 RestController和Controller的区别? Controller:默认返回的是jsp页面 RestController:返回的是一个js…

自然语言处理(NLP)—— 生成式模型和判别式模型

生成式模型和判别式模型是机器学习领域两大类模型,它们在自然语言处理、计算机视觉等领域都有广泛的应用。理解这两类模型的区别对于选择正确的模型来解决特定问题非常重要。 1. 生成式模型 (Generative Models) 生成式模型旨在学习数据的联合概率分布\(P(X, Y)\)&…

数据结构:顺序表的奥秘

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生🐻‍❄个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE🐼本文由GOTXX原创,首发CSDN&a…

C#,排列组合的堆生成法(Heap’s Algorithm for generating permutations)算法与源代码

1 排列组合的堆生成法 堆生成算法用于生成n个对象的所有组合。其思想是通过选择一对要交换的元素,在不干扰其他n-2元素的情况下,从先前的组合生成每个组合。 下面是生成n个给定数的所有组合的示例。 示例: 输入:1 2 3 输出&a…

4.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

ZigBee技术与实践教程(无线传感网技术第三天)

1.MAC层规范 在IEEE802系列标准中,OSI参考模型的数据链路层进一步划分为逻辑链路控制子层和介子访问子层两个子层。MAC子层使用物理层提供的服务实现设备之间的数据帧传输,而LLC在MAC 层的基础上,在设备之间提供面向连接和非连接的服务&…

音频视频如何转字幕,音频视频转字幕教程

音频或视频转字幕的教程通常涉及使用软件或在线服务来实现自动语音识别(ASR)技术,将音频中的语音内容转换成文字。以下是一个简化的通用教程: 使用AI工具进行音频/视频转字幕教程 方法一:使用音视频转字幕等具有AI加…

力扣523. 连续的子数组和

问题: 给你一个整数数组 nums 和一个整数 k ,编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组: 子数组大小 至少为 2 ,且子数组元素总和为 k 的倍数。 如果存在,返回 true ;否则&#xff…