检查Android处理程序是否有回调

检查Android处理程序是否有回调,android,handler,runnable,Android,Handler,Runnable,我有一些设置计时器的代码,但是如果用户在使用计时器时设置了计时器,我需要删除运行计时器的runnable并再次启动它。但当不存在处理程序回调runnable并且调用此代码时,我的应用程序就会崩溃。因此,我需要检查处理程序是否正在运行,如果是,则结束它并重新启动它,但查看文档和其他Stackoverflow问题,我看不出这是否可行 这是我的代码,我已经对代码进行了注释,只有在存在可运行的处理程序时才应执行该代码: submitTimer.setOnClickListener(new Vie

我有一些设置计时器的代码,但是如果用户在使用计时器时设置了计时器,我需要删除运行计时器的runnable并再次启动它。但当不存在处理程序回调runnable并且调用此代码时,我的应用程序就会崩溃。因此,我需要检查处理程序是否正在运行,如果是,则结束它并重新启动它,但查看文档和其他Stackoverflow问题,我看不出这是否可行

这是我的代码,我已经对代码进行了注释,只有在存在可运行的处理程序时才应执行该代码:

    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();
            }
    }

});

有人能帮我找出一种检查处理程序当前状态的方法吗?

如果需要,可以在第一次放入回调时发送一条空消息,然后在处理程序中检查该消息。此空消息可能表示存在回调。稍后删除该消息可以类似地用于查看回调是否仍然存在。我没有这样的相关情况,但我认为我至少会尝试分享一种可能性

...
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER);
...
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER)
...
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER);
...
这可能并不理想,但如果您可以从使用回调的位置访问处理程序,那么这可能是一个潜在的解决方案。不确定是否有直接的方法可以找到。

指的是客户的回复:

由于在某些情况下,
Map.handler.hasMessages(CALLBACK\u PRESENT\u INTEGER)
返回false,即使调用了
Map.handler.sendEmptyMessage(CALLBACK\u PRESENT\u 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;
}

...
我正在一个应用程序中使用这个解决方案,它工作得非常好