[TOC]

文章参考:http://gityuan.com/2017/04/09/android_context/

如何获取Context

Context的源码

Context的使用

Context可能引起的内存泄漏

1)错误的单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Singleton{
private static Singletoninstance;

private Context mContext;
private Singleton (Contextcontext) {
this.mContext=context;

}

publics tatic Singleton getInstance(Context context) {
if(instance==null){
instance = new Singleton(context);
}
returninstance;
}

}

即使 Activity 被销毁掉,但因为它的引用还存在于一个 Singleton中,就不可能被 GC掉

2)View 持有 Activity 引用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class MainActivity extends Activity{
private static Drawable mDrawable;
@Override
protected void onCreate(BundlesaveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
ImageViewiv = new ImageView(this);
mDrawable=getResources().getDrawable(R.drawable.ic_launcher);
iv.setImageDrawable(mDrawable);

}

}

有一个静态的 Drawable 对象当 ImageView 设置这个 Drawable 时,ImageView 保存了 mDrawable 的引用,而 ImageView 传入的 this 是 MainActivity 的mContext,因为被 static 修饰的 mDrawable 是常驻内存的,MainActivity 是它的间接引用,MainActivity 被销毁时,也不能被 GC 掉,所以造成内存泄漏。

总结

  • 尽量使用 Application 的 Context
  • 不要让生命周期长于 Activity 的对象持有其的引用
  • 尽量不要在 Activity 中使用非静态内部类,因为非静态内部类会隐式持有外部类示例的引用,如果使用静态内部类,将外部实例引用作为弱引用持有。大家可以参考Handler的弱引用使用方法。