本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众

单例模式在Android开发中会经常用到,但是如果使用不当就会导致内存泄露。因为单例的静态特性使得它的生命周期同应用的生命周期一样长,如果一个对象已经没有用处了,但是单例还持有它的引用,那么在整个应用程序的生命周期它都不能正常被回收,从而导致内存泄露。


public class Singleton {private static Singleton singleton = null;private Context mContext;public Singleton(Context mContext) {this.mContext = mContext;}public static Singleton getSingleton(Context context){if (null == singleton){singleton = new Singleton(context);}return singleton;}
}复制代码

像上面代码中这样的单例,如果我们在调用getInstance(Context context)方法的时候传入的context参数是Activity、Service等上下文,就会导致内存泄露。

当我们退出Activity时,该Activity就没有用了,但是因为singleton作为静态单例(在应用程序的整个生命周期中存在)会继续持有这个Activity的引用,导致这个Activity对象无法被回收释放,这就造成了内存泄露。

为了避免这样单例导致内存泄露,我们可以将context参数改为全局的上下文:


public Singleton(Context mContext) {this.mContext = mContext.getApplicationContext();
}复制代码

全局的上下文Application Context就是应用程序的上下文,和单例的生命周期一样长,这样就避免了内存泄漏。单例模式对应应用程序的生命周期,所以我们在构造单例的时候尽量避免使用Activity的上下文,而是使用Application的上下文。

定期推送优质文章

Android小知识-单例引起的内存泄漏相关推荐

  1. Android 系统(87)---常见的内存泄漏原因及解决方法

    常见的内存泄漏原因及解决方法 (Memory Leak,内存泄漏) 为什么会产生内存泄漏? 当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,这导致本该被 ...

  2. Android小知识10则(下)

    Android小知识10则(上) github传送门 注: 在目录中点击可以跳转到具体代码页 目录 Chronometer和CountDownTimer计时器 Chronometer的使用 Count ...

  3. Android小知识10则(上)(2018.8重编版)

    Android小知识10则(下) 目录 前言 横竖屏锁定 不同分辨率的图标 将字符串写在资源文件中 为AlertDialog设置点击监听 ProgressDialog了解一下 最后 前言 Androi ...

  4. 微信小程序开发过程中出现的内存泄漏问题

    微信小程序开发过程中出现的内存泄漏问题 问题描述 微信小程序项目中,有两个页面多次来回切换,(我这个项目数因为 有 再来一次,和 回顾本次 的功能 所以要在答题页和分数页来回切换)就会报错 VM333 ...

  5. java 单例 内存释放_周小抒 – 梦想仗剑走天涯 | Android中关于Context单例模式引起的内存泄漏以及解决方案...

    内存溢出与内存泄漏的区别: 内存溢出是由于应用所消耗的内存或者应用申请的内存超出了虚拟机分配的内存,也就是内存不够用了. 内存泄漏是某个不再使用对象由于被其他实例引用,导致不能被GC回收,而导致的内存 ...

  6. android小知识(1)

    1.Android名称的由来. 大家可能不知道,Android一词的本义原指"机器人",它也是谷歌于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操 ...

  7. Android 中的单例

    单例的价值所在: 当一个程序中有比较大的或者消耗内存的存在,这时候你就希望只是出现一个实例. 在移动开发中用到的话比较好.保持程序运行的时候该中始终只有一个实例存在内存中 public class S ...

  8. Cocos2dx小技巧 单例

    2019独角兽企业重金招聘Python工程师标准>>> 首先来说下什么是单例:   单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.  单 ...

  9. [android网络有效性检测] NetworkMonitor代码造成内存泄漏

    造成内存泄漏的log如下: E StrictMode: A resource was acquired at attached stack trace but never released. See ...

最新文章

  1. cwRsync文件双向同步问题
  2. 银行业应对信息安全威胁高危的三大原则
  3. 23种设计模式----------代理模式(一)
  4. App接口如何保证安全
  5. 来自网页的消息服务器繁处理忙,EventSource 对象用于接收服务器发送事件通知,是网页自动获取来自服务器的更新...
  6. Python 面向对象(二)
  7. AcWing 795. 前缀和
  8. SpringCloud工作笔记052---各种数据库在java中的连接配置_以及连接驱动
  9. Android Gradle指南系列
  10. 京东商品价格查询易语言代码
  11. 统计用产品分类目录8位代码类别_沪市主板605代码“1号选手”来了
  12. 阿里云盘 Mac客户端(附福利码)
  13. c语言打出的王字图形图形,C语言编程宝典(王大刚) 3 关键字和标识符
  14. 大学开设大数据专业,都安排了哪些课程?
  15. 宁夏开票系统服务器地址,宁夏增值税发票综合服务平台网址
  16. 流行QQ在线客服代码
  17. Android拍照相册裁剪封装
  18. 创业如创作,保持热爱
  19. 每天学一点英文:Espresso 20210812
  20. 跑分cpu_【新机】A14芯片最新跑分成绩曝光:3GHz主频,CPU/GPU提升20%丨特斯拉又双叒降价了...

热门文章

  1. mysql间隙锁触发条件,详解系列文章
  2. 字节跳动高工面试:mysql查询重复数据sql
  3. css光盘转动,CSS 实现加载动画之五-光盘旋转
  4. thinkcmf5调用指定分类的二级_python机器学习API介绍11: 伯努利贝叶斯分类器
  5. linux密码忘记grub登陆,CentOS7 忘记密码后通过修改grub进系统重置密码
  6. java 产生随机数_java生成随机数
  7. oracle怎么装系统,【Oracle安装与操作系统用户组】
  8. php回调后门,PHP 回调后门笔记
  9. pandas python2_Python随笔 | Pandas入门(二)
  10. oracle中脚本是什么意思,ORACLE常用脚本命令