2011-02-18 85 views
19

我有一個疑問..我有一個在我的應用程序中的活動hander。儘管我的活動摧毀了仍在運作的經理。它是否在應用程序進程以外的其他進程上運行?任何人都可以解釋爲什麼它的工作是這樣嗎? 在onDestroy活動時是否可以停止處理程序?如何停止處理程序?

在此先感謝。

+0

如果您提供處理程序的詳細信息會更有幫助,如果您發佈了代碼,則會更好。另外,你是否在不同的線程上實例化處理程序? – basilisk 2011-02-18 05:48:03

回答

1

你的意思是說你的活動中有某個線索嗎?停止一個線程很容易,你需要有一個線程的參考。像:

private Thread mMyThread; 
mMyThread = new Thread ....... 

,當你想停止它,只是檢查,如果引用不爲空,並調用中斷方法:

if (mMyThread != null) { 
    mMyThread.interrupt(); 
} 

希望這將有助於

+0

謝謝...它幫助了很多... – Taruni 2012-12-19 07:11:18

25

正如描述文檔

http://developer.android.com/reference/android/os/Handler.html

「每個處理器實例與單個線程和該線程的消息隊列相關聯。「

當您即將完成您的活動時,在onDestroy()還需要取消回調有人開始爲可運行:

mHandler.removeCallbacks(previouslyStartedRunnable); 

你可以做,即使沒有檢查是否可運行已經被解僱,而你的活動明顯活躍。

UPDATE:

有要考慮的兩個新情況:

1)你已經實現了在您爲Runnable接口,例如創建新類的方式處理程序

private class HandleUpdateInd implements Runnable... 

通常你需要做的,如果你要開始延遲可運行當前的參數設置(可能改變,直到運行的火災)。要取消它,你需要如果您使用內嵌調用(JPM感謝您的評論)

handler = new Handler() { public void handleMessage(Message msg) { ... } }; 

然後,你需要定義該消息「什麼」價值使用

mHandler.removeCallbacksAndMessages(HandleUpdateInd.class); 

2)。稍後,如果您需要取消它,您可以使用

handler.removeMessages(what); 

執行該任務。

+1

如果你的onCreate的一個活動內聯調用你如何做到這一點?即handler = new Handler(){public void handleMessage(Message msg){...}}; – JPM 2011-11-22 00:08:27

0

我喜歡Zelimir的回答,只是關於此事的更多信息 - Android沒有爲應用程序生命定義限制,應用程序是在第一次啓動時創建的,並且可能會在幾個活動onCreate/onDestroy循環之間保持活動狀態。處理程序與Application單個主事件線程/隊列相關聯,所以一個活動不能「停止」它(雖然你可能可以通過Handler.getLooper()。quit()來實現,但我不確定它是否贏得了'不會造成問題,也可以按照here中所述的方法殺死整個應用程序)。

Android的概念很可能是儘可能多地重用Applications實例,所以在開發Activity時主要關心的是在onDestroy調用中正確清除Activity的資源。處理程序中的靜態變量,線程,AsyncTasks和消息/回調是需要擔心的項目。