7

在我的应用程序中,我在单击按钮时创建了一个对话框,并在创建对话框时启动了处理程序现在我想在对话框关闭和活动后删除处理程序的回调,因此我在活动的 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);
4

5 回答 5

5

没有办法检查它是否有可运行的微粒。你可以打电话

handler_Alerts.removeCallbacks(r_Alerts); 

删除处理程序队列中的任何 r_Alerts 实例,或

handler_Alerts.removeCallbacks(null);

删除其队列中的所有可运行对象

于 2013-06-05T09:57:19.933 回答
3

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

handler_Alerts.removeCallbacks(null);

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

handler_Alerts.removeCallbacksAndMessages(null);

删除所有回调和消息。

于 2020-06-07T20:04:10.040 回答
2

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

One quick fix, in method assign some boolean variable to true and then just perform checking.
于 2018-11-20T15:41:10.580 回答
0

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

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

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

详细...

于 2015-01-14T11:46:30.507 回答
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

于 2019-03-29T02:40:00.207 回答