用handler發延時消息時最好設置設爲static

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


發佈了27 篇原創文章 · 獲贊 22 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章