android内存泄露--案例一Context(转)
2015-10-22 14:58
375 查看
public class MyActivity extends Activity{ private MyManager mMyManager = null; /* (non-Javadoc) * @see android.app.Activity#onCreate(android.os.Bundle) */ @Override protected 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) */ @Override protected 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); } }
相关文章推荐
- Android layout_weight体验(实现按比例显示)
- 比achartengine更加强大的Android图表控件。
- android几种alertdialog
- Android布局优化经验总结
- 安卓模拟器安装时,SDK ROOT UNDEFINED ,问题解决方案
- 基于Facebook Buck改造Android构建系统之初体验
- Android ActionBar完全解析(续)
- 【FastDev4Android框架开发】Android快速开发框架介绍(一)
- 《第一行代码Android》学习日记
- android4.4.2内核移植3.4.1
- Android-----自定义圆形的头像控件
- 深入浅析Android Fragment(下篇)
- Android内存管理整理
- 学习Android推送功能笔记(6)---Mina--CodecFactory自定义和一点别的扩展
- Android布局--Android fill_parent、wrap_content和match_parent的区别
- Android中的sp和wp指针
- Android 项目编译过程
- Android多线程处理
- 【android学习笔记】播放器中一些细节处理
- listview 刷新两次的问题