裏面一類礦井我有以下代碼:如何/何時收集處理程序垃圾?
mHandler = createHandler();
private Handler createHandler() {
return new Handler() {
public void handleMessage (Message msg) {
update();
if (!paused) {
sendEmptyMessageDelayed(0, 300);
}
}
};
}
文檔說:
http://developer.android.com/reference/android/os/Handler.html
每個處理程序實例與單個線程關聯和線程的消息隊列
所以,如果我理解正確的處理程序不是垃圾只要應用程序線程正在運行,就會收集到的信息是否正確?
在我的具體示例中,由於Handler是一個匿名內部類,因此它對封閉對象以及它所指向的對象的整個層次結構具有隱式引用。這看起來像是一個泄漏內存的配方。
順便說一句,我可以讓處理程序停止發送消息(這就是爲什麼我有if (!paused)
),但這不會使它被GCed,對吧?
那麼有沒有辦法從消息隊列中刪除處理程序,並讓它被GCed?
謝謝,這是最好的答案,切實解決我的問題。但是,如果在創建Handler後無法刪除Handler,我仍然認爲這是Android的一個設計弱點。 – Roland 2011-02-24 20:18:03