本文最后更新于:星期四, 六月 18日 2020, 9:01 上午
参考文章http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1106/1922.html
在用handler的时候如果这么用就一定会发生内存泄漏:
public class MainActivity extends AppCompatActivity { private Handler myHandler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
原因:这个myHandler对象是由匿名内部类创建而来的,然后内部类默认持有外部类的引用,假设我们用这个handler发送一个10分钟延迟的消息出去,然后马上关闭当前的activity,那么这个message就会在messageQueue停留10分钟,而messageQueue有这个handler的引用,handler又有了外部类MainActivity的引用,因此MainActivity就算退出了,还是无法被gc回收,造成内存泄漏。
解决方法:内部类不行,那么就用静态内部类,静态内部类的好处是静态内部类完全不依赖外部类,也就是没有外部类的引用,也就不会造成内存泄漏!
配合弱引用,代码如下:
public class MainActivity extends AppCompatActivity {
static class MyHandler extends Handler{
//Activity的弱引用
private WeakReference<AppCompatActivity> weakReference;
public MyHandler(AppCompatActivity activity){
weakReference=new WeakReference<AppCompatActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
AppCompatActivity activity=weakReference.get();
//做一个判断,如果Activity已经被gc回收,就不再执行该方法。
if (activity!=null){
//handle your message
}
}
}
private MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler=new MyHandler(this);
//handler.sendMessage(yourMsg);
}
}