android中单例模式为什么会引起内存泄漏?

单例模式使用不恰当会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 如果一个对象已经不需要使用了,但是单例对象还持有该对象的引用,那么这个对象就不能被正常回收,因此会导致内存泄漏。

举个例子:

①新建一个工程。

②配置好LeakCanary检测环境。

③添加一个单例类AppManager

④在MainActivity中使用此单例

运行代码后做如下操作:

①点击返回键,退出MainActivity。

②等待10秒。

做完如上操作后,LeakCanary提示MainActivity内存泄漏:

现在来分析一下内存泄漏的原因:

AppManager appManager = AppManager.getInstance(this);这句传入的是Activity的Context,由于Activty是间接继承自Context的。当这个Activity退出时Activity应该被回收, 但是单例中又持有它的引用,导致Activity回收失败,造成内存泄漏。

为了防止误传Activity的Context , 可以修改一下单例的代码:

这样不管外面传入什么Context,最终都会使用Applicaton的Context,而单例的生命周期和应用的一样长,这样就防止了内存泄漏。

修改完毕后,运行代码,重复以上操作,将会发现leakCanary没有检测出泄漏。

相关推荐
感谢地心引力6 分钟前
安卓、苹果手机无线投屏到Windows
android·windows·ios·智能手机·安卓·苹果·投屏
惊讶的猫30 分钟前
探究StringBuilder和StringBuffer的线程安全问题
java·开发语言
jmxwzy33 分钟前
Spring全家桶
java·spring·rpc
Halo_tjn35 分钟前
基于封装的专项 知识点
java·前端·python·算法
Fleshy数模1 小时前
从数据获取到突破限制:Python爬虫进阶实战全攻略
java·开发语言
像少年啦飞驰点、2 小时前
零基础入门 Spring Boot:从“Hello World”到可上线的 Web 应用全闭环指南
java·spring boot·web开发·编程入门·后端开发
苍煜2 小时前
万字详解Maven打包策略:从基础插件到多模块实战
java·maven
有来技术2 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
东东5162 小时前
xxx医患档案管理系统
java·spring boot·vue·毕业设计·智慧城市
一个响当当的名号3 小时前
lectrue9 索引并发控制
java·开发语言·数据库