我在主ui线程(mUIHandler)和工作线程(其他线程)中创建了一个Handler实例,当我尝试执行runnable的run方法时,run方法几乎被执行了9次,但是有一次它没有被执行。
mUIHandler.post(uiRunnable) - >并不总能保证执行runnable中存在的run方法吗?
我甚至添加了日志方法来检查并且可以看到日志直到post方法innvocation被执行但是run方法日志没有显示。
帖子(runnable)如何在内部工作?是否保证ui线程(带有处理程序的线程)会在调用post后立即执行此操作?
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:10)
我在Android 2.2上遇到过这个问题,在我的情况下,Runnables和Messages都与同一个Handler一起使用。
在查看Handler源代码后,发现删除“what”值为0的消息也会删除所有排队的Runnables。发生这种情况是因为在Handler类中,Runnable在内部发布为“what”值为零的消息,这些消息都被removeMessages(0)
的任何调用删除。因此,请避免将零用作消息ID。
答案 1 :(得分:6)
我从未见过Handler没有正确运行发布的runnable。一些需要调查的事情:
我的投票(没有看到你的代码)是它可能是#1。由于并发逻辑,你不会成为第一个成为难以追踪的竞争条件的受害者。