一旦用handler发出延时的message,message会被保存在消息队列中,这段延时的时间,message会保持对handler的引用,导致handler无法被回收,使用handler的activity和service也无法被回收,即使onDestroy()方法被调用。
这种情况应该把handler类修饰为static,这样handler类就是activity的静态内部类,静态内部类与外部类的关联不大,只是命名空间包了一层而已。这样即使handler无法被回收也不会对activity的回收造成影响。
但handler类被修饰为static后,在里面调用外部类的方法和成员必须也是static的,不太可能让activity的方法都因此改成static,解决办法是让handler类内部持有对activity的弱引用:
private static MyHandler extends Handler{
private WeakReference<MyActivity> mActivity;
public MyHandler(MyActivity act){
mActivity = new WeakReference<MyActivity>(act);
}
@override
public void handleMessage(Message msg){
if(msg.what == 1){
if(mActivity != null){
MyActivity act = mActivity.get();
//fun()方法就不必是static的了
act.fun();
}
}
}
}