内存泄露:生命周期短的对象,引用了生命周期长的对象。
1、产生原因:例子:
public class TestActivity extends Activity{
public Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
上面的例子中的handler,是一个内部类。
内部类,默认持有一个外部类的引用。
假设:activity被finish了,但是handler发了一个延时的message,handler并没有结束,activity就泄露了,就不会被gc回收。
2、处理方式:
一种是在activity的ondestroy方法中remove掉所有的handler的message,跟随activity一起finish;
一种是使用静态的handler内部类,就不会持有外部类的引用,就不会泄露了。