在我的应用程序中,我创建了一个关于按钮单击的对话框,并在对话框创建时启动了处理程序,现在我想在对话框关闭和活动后删除处理程序的回调,因此我在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);
答案 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);
... 这可能并不理想,但如果您可以从使用回调的位置访问处理程序,则可能是一种潜在的解决方案。不确定是否有直接的方法可以找到答案。
答案 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);
删除所有回调和消息。