2013-04-04 27 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; 
} 

... 

我使用在应用该解决方案,它的工作完美。

相关问题