2011-04-28 34 views
30

在我的應用程序中,我的處理程序不停止。我怎樣才能阻止處理程序?
它在關閉活動後繼續開始。我能做什麼?如何在Android中停止Handler?

代碼:

handler = new Handler() 
     { 
      @Override 
      public void handleMessage(Message msg) 
      { 
       // TODO Auto-generated method stub 
       super.handleMessage(msg); 
       if(i<max) 
       { 
        evnetChangedisplay(i); 
        i++; 
         handler.sendEmptyMessageDelayed(0, 5000); 
        } 
       else 
        { 
         i = 0; 
         handler.sendEmptyMessageDelayed(0,0000); 
        } 
       } 
     }; 
handler.sendEmptyMessageDelayed(0,000); 
+0

你是什麼意思「我的處理程序不停止」?你怎麼理解這一點? – 2011-04-28 13:15:54

+0

它的運行,因爲我在DDMS..by SYstem.out.println顯示..它繼續運行在我的應用程序.. – 2011-04-28 13:17:30

+0

你的意思是它繼續收到消息?然後停止發送這些消息給處理程序! – 2011-04-28 13:19:39

回答

9

考慮:

private Handler myHandler= new Handler(){ 
     @Override 
     public void handleMessage(Message msg){   
      switch(msg.what){ 
       case 0: 
        this.removeMessages(0); 
        messageSendingCodeWhat0(); 
       break; 
       default: 
        super.handleMessage(msg); 
        break; 
      } 
     } 
    }; 
6

它永遠不會停止,因爲你總是發送消息!我想你想刪除handler.sendEmptyMessageDelayed(0,0000);,這實際上是沒有意義的(你是否推遲了一個消息0毫秒?)。

3

只要Looper實例處於活動狀態,這是針對線程的整個生命週期(與活動生命週期無關),您的處理程序(如果以這種方式實現)將處於活動狀態。

如果您希望處理程序停止自行重新觸發,您需要自己處理。

無論如何,向自己發送0延遲的消息看起來有點奇怪。實際上你想達到什麼目的?

4

一個處理程序很簡單,就是一個線程的事件循環接口。所以,如果你停止線程,那麼你「停止」處理程序。

假設您的處理程序是用於後臺線程。

下面是一個例子,其中quit()旨在將一個looper.quit()方法發送到會停止線程和Handler的事件循環。因此,在您的Activity的onPause()或onStop()方法中,只需調用myThread.quit()即可。

+1

優秀的答案。 – aez 2014-12-06 02:46:18

57

聽起來活動在Handler執行代碼之前就完成了它的生命週期。您可以通過爲處理程序和可運行程序創建實例成員,然後在活動生命週期方法中管理處理程序來管理handler.post(可運行)。

private Handler myHandler; 
private Runnable myRunnable = new Runnable() { 
    @Override 
    public void run() { 
     //Do Something 
    } 
}; 

用handler.post啓動runnable。

protected void onStart() { 
    super.onStart(); 
    myHandler = new Handler(); 
    myHandler.post(myRunnable); 

} 

如果在調用onStop時沒有執行runnable,我們不想運行它。 中的onStop方法刪除回調:

protected void onStop() { 
    super.onStop(); 
    mHandler.removeCallbacks(myRunnable); 
} 
+0

它工作...在我的應用程序測試。 – keithics 2013-08-01 16:36:59

+0

myHandler必須onStop – mehmet 2016-12-24 09:26:24