android开发中对context引用造成内存泄漏的一些猜测
来源:互联网 发布:apache nginx 编辑:程序博客网 时间:2024/06/05 02:33
Context在android特性空间被用来描述Activity的一组抽象行为,那么也就说有一个Activity就有一个Context(Activity是继承Context的)。
我们在开发应用程序的时候总是会遇到这样的问题:
public class MyActivity extends Activity{private MyManager mMyManager = null;/* (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//...layout 初始化mMyManager = new MyManager(this);}
public class MyManager {private Context mContext = null;public MyManager(Context context) {mContext = context;}}
从上面的代码我们可以看到MyManager是依赖于MyActivity,同时MyActivity也依赖于MyManager,两个类形成了双向依赖关系,也称为圈依赖。
这个时候有的同学担心,这个时候用context作为参数传递到MyManager中,当myactivity被回收之后,会不会导致内存泄漏。本人给出的答案是不会造成内存泄漏的
因为两个类处于圈依赖关系,并且属于双向可到达状态,但是两个类都处于不可达到区域,也就是说除了这两个类之外,再没有第三个类引用这两个类,那么这种情况在GC的时候这两个类是会被同时回收掉的。
那么再换一个写法,我把MyManager改一下
public class MyManager {private Context mContext = null;private static MyManager mInstance = null;public static MyManager getInstance(Context context) {if (mInstance == null) {synchronized (MyManager.class) {if (mInstance == null) {mInstance = new MyManager(context);}}}return mInstance;}private MyManager(Context context){mContext = context;}}
public class MyActivity extends Activity{private MyManager mMyManager = null;/* (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//...layout 初始化mMyManager = MyManager.getInstance(this);}}
我把MyManager写成了单例模式,那么这个类的生命周期就伴随整个应用的生命周期了。如果在这个时候android GC了MyActivity,但是由于MyManager仍然引用了MyActiviy(Context),所以MyActivity仍然无法被系统回收,这样就造成内存溢出了,那么这样的问题如何解决呢?我建议使用弱引用,继续上代码:
public class MyManager {private WeakReference<Context> wr = null;private static MyManager mInstance = null;public static MyManager getInstance(Context context) {if (mInstance == null) {synchronized (MyManager.class) {if (mInstance == null) {mInstance = new MyManager(context);}}}return mInstance;}private MyManager(Context context){wr = new WeakReference<Context>(context);}}
这里我分析一下为什么用弱引用,如果你对弱引用还不是很了解,那么请看我的这篇文章 《谈谈java中的WeakReference》。回头我们分析,如果这个时候系统析构了MyActivity对象,那么也就意味着context对象被置空了,那这个时候MyManager由于引用了context的弱引用,所以不会影响对MyActivity的回收,当然context为null对象,所以Mymanager中用到context来处理业务的时候需要做空判断了。
- android开发中对context引用造成内存泄漏的一些猜测
- android开发中对context引用造成内存泄漏的一些猜测
- Android中Context的内存泄漏
- 避免引用Context造成的内存泄露
- android 内存泄漏之Context--整理-引用
- android开发中单例造成的内存泄漏原因及解决方案
- 关于造成内存泄漏的一些原因
- 在单例模式中如何避免传入非Application的Context造成的内存泄漏
- 避免android程序开发内存泄漏-context
- 单例中引用Context导致内存泄漏的问题
- PHP对象递归引用造成内存泄漏
- Android内存泄漏(线程造成的内存泄漏与资源未关闭造成的内存泄漏)
- IBOutlet造成的内存泄漏
- cdbexception造成的内存泄漏
- MVP造成的内存泄漏
- Android 内存泄漏——context泄漏
- Android Handler造成的内存泄漏的分析j
- 浅谈在Android中存在的一些内存泄漏
- C#.在vs2010中打开vs2012的项目
- 创建、结构、行为型设计模式类型归纳
- IOS 设置背景图片
- myfocus的使用
- IOS绘图详解
- android开发中对context引用造成内存泄漏的一些猜测
- C++类调用和回调实例
- 30个基于jQuery的日期时间选择插件
- 盘点 2012 年没落科技巨头
- NetVuser的用法
- 【解决方案】Vmware安装时出现的"already installed"错误
- STK应用没有显示
- MySql报错: You can't specify target table 'table name' for update in FROM clause
- linux 目录介绍