Android谨防单例模式的内存泄露
来源:互联网 发布:手机上看图软件 编辑:程序博客网 时间:2024/06/05 07:18
通常单例模式最简单,在程序中也用的最多,如果使用不当,极易造成内存泄露,比如一下一个例子:
package com.tb.demo.utils.hangview;import android.content.Context;/** * Created by tb */public class TbUtility { private Context mContext; public static TbUtility mTbUtility; /** * 构造方法 * * @param context * 上下文 */ TbUtility(Context context) { this.mContext = context; } /** * 单例模式 * * @param context * 上下文 * @return */ public static TbUtility getInstance(Context context) { if (mTbUtility == null) { mTbUtility = new TbUtility(context); } return mTbUtility; }}
通常我们都这么申明和使用一个单例,殊不知,这就会造成内存泄露,这种写法是存在问题的。
解释如下:
比如进入App的第一个Activity是Login.java,登陆成功后跳转到Main.java,登陆的时候顺其自然的调用了这个单例,单例传进去的上下文的当前的activity的上下文,然后销毁登录页面,记住密码,进入主页面,但是登录的Activity被一个单例持有,导致垃圾回收器无法进行回收,进而产生了内存泄露,这是我们都不愿意发生的事情,我们需要去想办法解决。
解决思路:就是不持有Activity的引用,而是持有Application的Context引用,代码修改如下:
package com.tb.demo.utils.hangview;import android.content.Context;/** * Created by tb */public class TbUtility { private Context mContext; public static TbUtility mTbUtility; /** * 构造方法 * * @param context * 上下文 */ TbUtility(Context context) { this.mContext = context.getApplicationContext(); } /** * 单例模式 * * @param context * 上下文 * @return */ public static TbUtility getInstance(Context context) { if (mTbUtility == null) { mTbUtility = new TbUtility(context); } return mTbUtility; }}
1 0
- Android谨防单例模式的内存泄露
- Android单例模式造成内存泄露
- Android 使用单例模式有可能引起的内存泄露
- Android 单例模式引起的内存泄露
- 单例模式造成的内存泄露
- Android开发 单例模式导致内存泄露
- 谨防数组函数返回值造成的内存泄露
- 谨防动态数组越界造成的内存泄露
- Android性能优化-单例所引起的内存泄露
- 内存异常系列之单例模式导致内存泄露
- 内存异常系列之单例模式导致内存泄露
- Android性能优化(一)内存泄露优化(静态变量、单例模式、属性动画)
- android的内存泄露
- android的内存泄露
- Android 单例模式引起的内存泄漏
- 慎用闭包谨防跨页面内存泄露
- Android 内存泄露检查之StrictMode模式
- android内存泄露的问题
- 腾讯后台开发面试题--整理3
- spring mvc包含的功能
- Java第一周:1.3
- ubuntu 怎么以root权限登陆
- DICOM:DICOM三大开源库对比分析之“数据加载”
- Android谨防单例模式的内存泄露
- zookeeper学习
- 数据库的学习
- 【各种系列教程】fms p2p文字教程 第三节FMS广播
- 很短...道理很深
- hdu 4969 Just a Joke(数学)
- 数据库学习2
- HDU 3376 Matrix Again(费用流)
- mysql性能优化