android handler内存泄露及解决方案
在java中,非静态的内部类和匿名内部类都会隐式的持有一个外部类的引用。静态内部类则不会持有外部类的引用。
那我们先看下面这段代码:
private Handler odmHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用odmHandler执行延迟任务runnable.
//使用odmHandler.sendEmptyMessageDelayed()执行延迟任务,
odmHandler.postDelayed(new Runnable() {
@Override
public void run() {
}
}, 5000);
finish();
}如上代码,在oncreate方法的最后,我们直接finsh了当前的activity,原则上则activity是要被销毁的,但因为我们odmHandler是被delay的Message持有了引用的,如果外部类是Activity,odmHandler又隐式的持有外部类(Activity)的引用,此时延时的message还未及时被处理,就finsh()了,或是按返回键退出销毁了Activity,那么就会引起Activity泄露 。因为原本应该finish()的activity无法被GC正常内存回收,
static class MyHandler extends Handler{
private final WeakReference<Activity> mWeakReference;
public MyHandler(Activity activity)
{
mWeakReference=new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg)
{
final Activity activity= mWeakReference.get();
if(activity!=null)
{
if (msg.what == 1)
{
activity.xxx();
}
}
}
}再加在Activity的onDestroy()方法中加这句:
@Override
public void onDestroy() {
// 移除所有消息
handler.removeCallbacksAndMessages(null);
// 或者移除单条消息
handler.removeMessages(what);
}版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。







评论