2013-04-04 28 views
7

我有一些代碼設置了定時器,但是如果用戶在使用它時設置了定時器,我需要刪除運行定時器並重新啓動它的runnable。但是,如果沒有處理程序回調runnable存在,並且調用此代碼,它會使我的應用程序崩潰。所以我需要檢查一個處理程序是否正在運行,如果是,然後結束並重新啓動它,但通過查看文檔和其他Stackoverflow問題,我看不到這是否可能。檢查Android處理程序是否有回調

submitTimer.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      String s = timer.getText().toString(); 
      if(!s.equals("")) 
      { 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      Map.handler.removeCallbacks(Map.getRunnable()); 
      Map.runnable.run(); 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      int l = Integer.parseInt(s); 
      Map.timerinmins = l; 
      timer.setHint("Current Timer is "+Map.timerinmins); 
      timer.setText(""); 
      Toast.makeText(Preferences.this, "Timer is set!", Toast.LENGTH_SHORT).show(); 
      } 

      else 
      { 

       Toast.makeText(Preferences.this, "No value was entered", Toast.LENGTH_SHORT).show(); 
      } 
    } 

}); 

誰能幫我找出檢查處理當前狀態的一種方式:

這裏是我的代碼,我身邊有可運行的,如果一個處理程序存在哪些應該只執行的代碼評論?

回答

4

如果您希望在第一次回撥時發送空消息,然後在處理程序中檢查該消息。這個空的消息可能表示存在回調。稍後刪除該消息可以類似地使用,以查看回調是否仍然存在。沒有這樣的相關情況,但我認爲我至少會嘗試並分享一種可能性。

... 
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER); 
... 
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) 
... 
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER); 
... 

這可能是不理想的,但如果你從哪裏使用您的回調點訪問您的處理器可能是一個潛在的解決方案。不知道是否有直接的方法來找出答案。

3

參考Jay Snayder的答覆:

由於在其中Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER)返回false即使Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER)被稱爲情況下(發生在我身上,太),它可能是更安全的使用一個布爾值,以確定是否處理程序有回調與否。
所以,代碼的邏輯是這樣的很簡單:

... 

boolean callbackPresent = false; 

... 

if(!callbackPresent) { 

    // do what you have to do in case the handler doesn't have callbacks 

    // right before adding a callback to the handler, call: 
    callbackPresent = true; 

} else { 

    // do what you have to do in case the handler has callbacks 

    // right before removing the callbacks from the handler, call: 
    callbackPresent = false; 
} 

... 

我使用在應用該解決方案,它的工作完美。

相關問題