如何检查处理程序是否有回调

时间:2013-06-05 09:51:58

标签: android

在我的应用程序中,我创建了一个关于按钮单击的对话框,并在对话框创建时启动了处理程序,现在我想在对话框关闭和活动后删除处理程序的回调,因此我在oncreate活动方法上创建了一个处理程序,它不断检查标志当对话框解散时我设置为true,当flag变为true时,应该删除处理程序的回调,但不删除处理程序的回调。

final Handler handler_Alerts = new Handler();
    Runnable r_Alerts = new Runnable() {
    public void run() {
       if(Flag){
            handler1.removeCallbacks(rhandler1);
           }
  Toast.makeText(getApplicationContext(), "In Handler", Toast.LENGTH_SHORT).show();
    handler_Alerts.postDelayed(this, 1000);
                  }
        };

    handler_Alerts.postDelayed(r_Alerts, 1000);

5 个答案:

答案 0 :(得分:3)

无法检查是否有特定的可运行物品。你可以打电话

handler_Alerts.remove(r_Alerts); 

删除Handler队列中的任何r_Alerts实例,或

handler_Alerts.remove(null);

删除队列中的所有runnable

答案 1 :(得分:1)

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

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

... 这可能并不理想,但如果您可以从使用回调的位置访问处理程序,则可能是一种潜在的解决方案。不确定是否有直接的方法可以找到答案。

for detail...

答案 2 :(得分:0)

可以检查是否调用了postDelayed()吗?

One quick fix, in method assign some boolean variable to true and then just perform checking.

答案 3 :(得分:0)

好的另一种解决方案可能就是扩展现有的Handler类(Kotlin):

class MarkingHandler: Handler() {

    private val markedCallbacks = ConcurrentHashMap<Int, Runnable>()

    fun postMarkedDelayed(markId: Int, delayMIllis: Long, callback: () -> Unit) {
        if(hasMarkedCallback(markId))
            throw IllegalArgumentException("The markId id is already exist in the handler")
        markedCallbacks[markId] = Runnable {
            markedCallbacks.remove(markId)
            callback()
        }
        postDelayed(markedCallbacks[markId], delayMIllis)
    }

    fun removeMarkedCallback(markId: Int) {
        if(hasMarkedCallback(markId)) {
            removeCallbacks(markedCallbacks[markId])
            markedCallbacks.remove(markId)
        }
    }

    fun hasMarkedCallback(markId: Int) = markedCallbacks.contains(markId)
    fun hasMarkedCallbacks() = markedCallbacks.size > 0
}

用法:

        val handler_Alerts = MarkingHandler() 
        handler_Alerts.postMarkedDelayed(1, 1000) runnable@{
            Toast.makeText(getApplicationContext(), "In Handler", Toast.LENGTH_SHORT).show()
            handler_Alerts.postMarkedDelayed(1, 1000, return@runnable)
        }

        if(handler_Alerts.hasMarkedCallback(1) /*|| handler_Alerts.hasMarkedCallbacks()*/) {
            handler_Alerts.removeMarkedCallback(1)
        }

类似的方法也可以用于在post(delayMIllis: Long)类中包装MarkingHandler方法

答案 4 :(得分:0)

没有评论的声誉,但有黑带的:

handler_Alerts.removeCallbacks(null);

不应根据开发者网站运行,因为传递的Runnable不能为null。 而是致电:

handler_Alerts.removeCallbacksAndMessages(null);

删除所有回调和消息。