在整个网络和Stack Overflow上都有对UI线程事件队列的引用。例如, runOnUiThread()会将操作发布到UI线程的事件队列。但我还没有找到这个队列的详细描述,那么有人可以指点我一个详细的,或回答几个问题吗?
1。我认为它是一个队列,并且它包含"行动",但是我很不清楚什么是"行动&# 34;是。 Action方法调用是否带有相关参数,或者是对线程本身的指令,还是什么?
2. 。所有线程都有事件队列还是只有UI线程?
3. 如何查看事件队列中的内容,或获取事件数?
4. 确切地确定队列中的某个操作何时执行?
5. View类有一个名为 cancelPendingInputEvents()的方法,用于" 取消任何延迟的高级输入事件以前发布到事件队列。"如果事件队列是线程的属性,为什么这是View类的方法,或者视图是否有一些不同的事件队列?
6. 消息队列和事件队列是否有两个不同的队列? NB - 有人在SO here上问了这个问题,回答者开始说他们是同义词,然后附上一个附录,这似乎意味着消息不同,所以我不清楚最终的结果是什么答案是。
答案 0 :(得分:5)
run();
。Looper.prepare()
的线程,因此任何线程都可以拥有它们。这样的运行时异常"无法在线程中创建未调用Looper.prepare()" new Handler()
来创建新的UI线程处理程序。然后通过调用handler.post(Runnable)
阅读文档总是有帮助的:
https://developer.android.com/reference/android/os/Handler.html
https://developer.android.com/reference/android/os/MessageQueue.html
答案 1 :(得分:2)
它只是一个标准的消息循环,就像每个GUI平台一样。 “事件”是CS术语,而不是特定对象。想象一下,在Android框架内你会看到类似这样的东西:
MessageQueue queue;
void run(){
while(1){
queue.waitForEvent();
Message msg = queue.getEvent();
//Handle msg
}
}
只有UI线程有一个事件循环,尽管你可以在另一个线程上编写自己的。
您无法查看事件队列或获取事件列表。你需要知道的将在你的代码中调用一些函数
一旦线程可以执行事件。如果队列中没有事件,则线程休眠。它们应该按顺序执行,尽管框架可能会对某些事件作出欺骗。
消息队列和事件队列是一回事。还有一个名为MessageQueue的类,它与我们在这里讨论的队列不同,但可以用来实现一个。