一旦用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();
}
}
}
}