您的位置:首页 > 移动开发 > Android开发

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: