【问题标题】:Can android handlemessage be reentered?可以重新输入android句柄消息吗?
【发布时间】:2017-01-15 11:48:01
【问题描述】:

我有一个从计时器定期更新 UI 的处理程序。 有时更新可能需要比计时器间隔更长的时间。在这种情况下会发生什么? Android 是否监视 handlemessage 以确保它完成工作,还是我应该自己做?可能是一个愚蠢的问题,但经过长时间的谷歌搜索后没有找到任何参考。

编辑:

我之所以问是因为我有ConcurrentLinkedQueue,并且其中的元素在从handlemessage 调用的方法中被删除。这是它们被删除的唯一地方,但有时我可以看到 2 个元素被删除而不是一个。像handlemessage 被重新输入。 如果根据@Gabe 的说法是不可能的,还有什么其他解释?

【问题讨论】:

  • 不,你不能按照你的逻辑自己做。
  • 有任何参考可以证实这一点吗?只想知道我错过了什么链接。 :)

标签: android multithreading timer android-handler


【解决方案1】:

到处理程序的所有消息都发生在同一个线程上。因此,除非您直接调用 handler.handleMessage ,否则不可能有可重入实例。处理程序是事件循环的一部分 - 事件被发送到 Looper 对象,当线程完成每个事件时,它从 Looper 获取下一个事件(在这种情况下,事件是处理程序消息)并以 FIFO 顺序处理它。

【讨论】:

    【解决方案2】:

    发送到Handler 的消息按顺序排队和处理,但这并不意味着它们的处理速度是均匀的。考虑这段代码:

    myHandler.postDelayed(thisRunnableWillTakeTenSeconds, 1000);
    myHandler.postDelayed(anotherRunnable, 2000);
    

    第二个Runnable 将在第一个之后立即执行,而不是 1 秒后,因为当第一个完成时它已经过期了。

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多