2011-05-04 29 views
19

如果未完成,我會創建1分鐘延遲計時器以關閉服務。看起來是這樣的:如何取消代碼中的處理程序?

private Handler timeoutHandler = new Handler(); 

裏面的onCreate()

timeoutHandler.postDelayed(new Runnable() 
     { 
      public void run() 
      { 
       Log.d(LOG_TAG, "timeoutHandler:run"); 

       DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); 
       finalizeService(); 
      } 
     }, 60 * 1000); 

如果我得到這個前1分工作完成 - 我希望得到取消了延遲的事情,但不知道如何。

回答

41

你不能用匿名Runnable來做到這一點。將Runnable保存到一個命名變量如何?

Runnable finalizer = new Runnable() 
    { 
     public void run() 
     { 
      Log.d(LOG_TAG, "timeoutHandler:run"); 

      DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); 
      finalizeService(); 
     } 
    }; 
timeoutHandler.postDelayed(finalizer, 60 * 1000); 

... 

// Cancel the runnable 
timeoutHandler.removeCallbacks(finalizer); 
+1

tiemoutHandler.removeCallbacksAndMessages(null);刪除所有回調以處理匿名Runnable。 (正如AbdelHady答案中所提到的) – Lorenz03Tx 2016-07-22 13:45:04

+2

只要您不介意刪除所有回調,而不僅僅是這一個,這就是花花公子。 OP詢問關於刪除特定回調。 – 2016-07-26 20:34:51

+0

非常感謝你 – 2018-02-15 06:22:24

8

你可能想利用sendMessageDelayed更換使用postDelayed像這樣:

private Handler timeoutHandler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) 
    { 
      switch (msg.what){ 
     case 1: 
      ((Runnable)msg.obj).run(); 
      break; 
     } 
    } 
}; 

然後發佈一條消息:

Message m = Message.obtain(); 
m.what = 1; 
m.obj = new Runnable(){ 
      public void run() 
      { 
       Log.d(LOG_TAG, "timeoutHandler:run"); 

       DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); 
       finalizeService(); 
      } 
     }; 
timeoutHandler.sendMessageDelayed(m, 60 * 1000); 

,然後取消:

timeoutHandler.removeMessages(1); 

無需跟蹤runnable。

10

如果你不想保持可運行的參考,你可以直接電話諮詢:

timeoutHandler.removeCallbacksAndMessages(null); 

The official documentation說:

...如果標記爲空,所有的回調和消息將被刪除。

相關問題