我有一些设置计时器的代码,但如果用户在使用计时器时设置计时器,我需要删除运行计时器的runnable并重新启动它。但是当没有处理程序回调runnable存在并且调用此代码时,它会崩溃我的应用程序。所以我需要检查处理程序是否正在运行,如果是,则结束并重新启动它,但查看文档和其他Stackoverflow问题,我看不出这是否可行。
这是我的代码,我已经对代码进行了评论,只有在处理程序runnable存在时才应该执行:
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();
}
}
});
任何人都可以帮我找出一种检查处理程序当前状态的方法吗?
答案 0 :(得分:5)
如果您希望在第一次进行回调时发送空消息,然后在处理程序中检查该消息。此空消息可能表示存在回调。然后可以类似地使用以后删除该消息来查看回调是否仍然存在。没有像这样的相关情况,但我认为我至少会尝试并分享一种可能性。
...
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER);
...
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER)
...
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER);
...
这可能不太理想,但如果您可以从使用回调的位置访问您的处理程序,则可能是一个潜在的解决方案。不确定是否有直接的方法可以找到答案。
答案 1 :(得分: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;
}
...
我在应用中使用此解决方案并且它运行良好。