Android谨防单例模式的内存泄露
2015-09-06 00:02
423 查看
通常单例模式最简单,在程序中也用的最多,如果使用不当,极易造成内存泄露,比如一下一个例子:
通常我们都这么申明和使用一个单例,殊不知,这就会造成内存泄露,这种写法是存在问题的。
解释如下:
比如进入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; } /** * 单例模式 * * @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; } }
相关文章推荐
- Android 的命名规范
- android 本地推送消息(无数据交互)
- Android图片失真问题
- Android 4.4+ 实现半透明状态栏(Translucent Bars)
- Android ListView详解(一)
- android中图片色调识别探究
- 一个简单的android电池显示layout
- android学习之ListView的基本使用
- Android-URLConnection (多图上传,数据上传,数据请求,图片请求)
- Android 定时器TimerTask 简单使用
- Android学习——状态栏通知
- Android 图片上传
- 9.5android线程优先级,go和rust比较
- android中ViewPager的用法以及自动滚动播放实现初探
- ADT升级中出现的问题的解决方案
- Android延时操作方法
- Android回调机制(java)
- Android 运行时找不到类:java.lang.NoClassDefFoundError:
- Android之ViewGroup实现可拖动的GridView
- Android:常用知识篇之 EditText和输入法相关的问题