android handlemessage 可以重新输入吗?
Can android handlemessage be reentered?
我有一个处理程序可以从计时器定期更新 UI。
有时更新可能需要比定时器间隔更长的时间。在这种情况下会发生什么? Android 会监控 handlemessage
以确保它完成工作,还是我应该自己做?可能是一个愚蠢的问题,但经过长时间的谷歌搜索后没有找到任何参考。
编辑:
我问是因为我有 ConcurrentLinkedQueue
,其中的元素在从 handlemessage
调用的方法中被删除。这是它们被移除的唯一地方,但有时我可以看到 2 个元素被移除而不是一个。就像重新输入 handlemessage
一样。
如果根据@Gabe 的说法这是不可能的,还有什么其他解释?
处理程序的所有消息都发生在同一个线程上。因此,除非您直接调用 handler.handleMessage ,否则不可能有重入实例。处理程序是事件循环的一部分——事件被发送到 Looper 对象,当线程完成每个事件时,它从 Looper 获取下一个事件(在这种情况下,事件是处理程序消息)并以 FIFO 顺序处理它。
发送到 Handler
的消息按顺序排队和处理,但这并不意味着它们以均匀的速度处理。考虑这段代码:
myHandler.postDelayed(thisRunnableWillTakeTenSeconds, 1000);
myHandler.postDelayed(anotherRunnable, 2000);
第二个 Runnable
将在第一个之后立即执行,而不是 1 秒后,因为当第一个完成时它已经过期了。
我有一个处理程序可以从计时器定期更新 UI。
有时更新可能需要比定时器间隔更长的时间。在这种情况下会发生什么? Android 会监控 handlemessage
以确保它完成工作,还是我应该自己做?可能是一个愚蠢的问题,但经过长时间的谷歌搜索后没有找到任何参考。
编辑:
我问是因为我有 ConcurrentLinkedQueue
,其中的元素在从 handlemessage
调用的方法中被删除。这是它们被移除的唯一地方,但有时我可以看到 2 个元素被移除而不是一个。就像重新输入 handlemessage
一样。
如果根据@Gabe 的说法这是不可能的,还有什么其他解释?
处理程序的所有消息都发生在同一个线程上。因此,除非您直接调用 handler.handleMessage ,否则不可能有重入实例。处理程序是事件循环的一部分——事件被发送到 Looper 对象,当线程完成每个事件时,它从 Looper 获取下一个事件(在这种情况下,事件是处理程序消息)并以 FIFO 顺序处理它。
发送到 Handler
的消息按顺序排队和处理,但这并不意味着它们以均匀的速度处理。考虑这段代码:
myHandler.postDelayed(thisRunnableWillTakeTenSeconds, 1000);
myHandler.postDelayed(anotherRunnable, 2000);
第二个 Runnable
将在第一个之后立即执行,而不是 1 秒后,因为当第一个完成时它已经过期了。