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

8

在我的应用程序中,我已经在按钮点击时创建了一个对话框,并在对话框创建时启动了处理程序。现在我想在对话框解除和活动上之后删除处理程序的回调函数。因此,我在活动的oncreate方法中创建了一个处理程序,该处理程序连续检查我设置为true的标志,当对话框解除时标志变为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);

如果回调函数不存在,你想要移除它吗?但是如果它不存在,你怎么能移除它呢? - Bradley Campbell
现在,如果这个处理程序没有任何回调函数,我想要移除它的回调函数。但是,如果不存在任何回调函数,你怎么能移除它呢? - pskink
抱歉,这句话可能有点难懂,但是是否有类似于 handler.hasmessage() 的方法可以用于回调,以便在删除回调之前检查处理程序是否具有回调,并且我必须删除该回调。 - ashokk
2
请阅读此内容,可能对您有所帮助。 点击此处查看链接说明 - Ashok Kateshiya
5个回答

5

我虽然没有足够的声望来评论,但是关于Blackbelt:

handler_Alerts.removeCallbacks(null);

根据开发者网站,不应该工作,因为传递的Runnable不能为空。 应该改为调用:

handler_Alerts.removeCallbacksAndMessages(null);

删除所有回调函数和消息。


5

无法检查它是否具有特定的可运行项。您可以调用

handler_Alerts.removeCallbacks(r_Alerts); 

为了移除 Handler 队列中的任何 r_Alerts 实例,或者

handler_Alerts.removeCallbacks(null);

从队列中删除所有可运行项


2

有没有可能检查postDelayed()是否被调用过?

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

0

如果您想的话,可以在第一次放置回调时发送一个空消息,然后在处理程序中检查该消息。这个空消息可以表示存在回调。稍后删除该消息也可以类似地用于查看回调是否仍然存在。没有相关的情况可供参考,但我认为至少应该尝试并分享一种可能性。

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

这可能不是最理想的解决方案,但如果您可以从使用回调函数的地方访问到处理程序,这可能是一个潜在的解决方案。不确定是否有直接的方法可以找出来。

详细信息...


12
这看起来像是一篇未经标注的抄袭回答,原始答案链接为:https://dev59.com/aXDYa4cB1Zd3GeqPBYch#15816840 - CJBS

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接