【问题标题】:handler.post(runnable) doesnt always execute the run method in androidhandler.post(runnable) 并不总是在android中执行run方法
【发布时间】:2012-03-02 04:47:42
【问题描述】:

我在主 ui 线程(mUIHandler)和工作线程(其他线程)中创建了一个 Handler 实例,当我尝试执行 runnable 的 run 方法时,run 方法在 10 次中几乎被执行了 9 次,但是有1次没有被执行。

mUIHandler.post(uiRunnable) --> 不总是保证执行runnable中存在的run方法吗?

我什至添加了日志方法来检查,并且可以看到日志直到 post 方法调用被执行,但 run 方法日志没有显示。

post(runnable) 如何在内部工作?是否保证 ui 线程(带有处理程序的线程)会在调用 post 后立即执行此操作?

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • @thinksteep 将尝试研究下面 mattc 给出的建议,看看我是否可以做点什么。我避免在此处发布代码 sn-p,因为它有 500 多行代码。谢谢!

标签: android multithreading handler


【解决方案1】:

我在 Android 2.2 上也遇到过这个问题,就我而言,Runnables 和 Messages 都与同一个 Handler 一起使用。

查看 Handler 源代码后发现,删除 'what' 值为 0 的消息也会删除所有排队的 Runnable。发生这种情况是因为在 Handler 类中,Runnable 在内部作为消息发布,“what”值为零,任何对removeMessages(0) 的调用都会删除这些消息。因此,请避免使用零作为消息 ID。

【讨论】:

  • 如果有两个首选答案就好了。我不知道你用这个答案为我节省了多少时间,但这是很多时间!
【解决方案2】:

我从未见过一个处理程序不能正确运行发布的可运行文件。需要调查的一些事情:

  1. 在 UI 线程可运行对象正在执行时,是否有任何逻辑可能导致线程可能与之交互的数据之间出现竞争条件?
  2. 您是否有任何可能默默吃异常的 try/catch?

我的投票(没有看过你的代码)是它可能是#1。由于并发逻辑,您不会成为第一个成为难以追踪的竞争条件的受害者。

【讨论】:

  • 感谢 Mattc 的回答,我将交叉检查可能的竞争条件。(希望我能找到它。)会更新。
  • 感谢@Mattc,这是竞争条件。幸好能够找到原因。确实是一个很好的学习。
  • 很高兴你找到了它。众所周知,线程逻辑非常挑剔且难以调试。
  • 回答这个问题也可能会有所帮助stackoverflow.com/questions/13548995/… 这对我有帮助,在 onCreate 中创建一个处理程序,然后在需要时传递它。
  • 嗨@MattC 你说你从未见过不能正常运行的处理程序发布可运行。请看一下my question 我在那里添加了一些测试代码,并且处理程序似乎没有按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2012-03-20
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多