想要了解有关Android UI Thread&#39的事件队列的更多信息

时间:2014-05-28 16:39:17

标签: android events

在整个网络和Stack Overflow上都有对UI线程事件队列的引用。例如, runOnUiThread()会将操作发布到UI线程的事件队列。但我还没有找到这个队列的详细描述,那么有人可以指点我一个详细的,或回答几个问题吗?

1。我认为它是一个队列,并且它包含"行动",但是我很不清楚什么是"行动&# 34;是。 Action方法调用是否带有相关参数,或者是对线程本身的指令,还是什么?

2. 。所有线程都有事件队列还是只有UI线程?

3. 如何查看事件队列中的内容,或获取事件数?

4. 确切地确定队列中的某个操作何时执行?

5. View类有一个名为 cancelPendingInputEvents()的方法,用于" 取消任何延迟的高级输入事件以前发布到事件队列。"如果事件队列是线程的属性,为什么这是View类的方法,或者视图是否有一些不同的事件队列?

6. 消息队列和事件队列是否有两个不同的队列? NB - 有人在SO here上问了这个问题,回答者开始说他们是同义词,然后附上一个附录,这似乎意味着消息不同,所以我不清楚最终的结果是什么答案是。

2 个答案:

答案 0 :(得分:5)

  1. 它是Runnables的队列。该线程在每个runnable上调用run();
  2. 只调用Looper.prepare()的线程,因此任何线程都可以拥有它们。这样的运行时异常"无法在线程中创建未调用Looper.prepare()"
  3. 你不能。 Stuff由平台管理,并调用Activity回调,Fragment回调,调度触摸事件,运行动画,运行布局,测量和绘制。所有这些都在UI线程中。
  4. AFAIK它是一个FIFO。但我可能错了。
  5. 视图具有UI线程的处理程序。处理程序绑定到线程及其MessageQueue。这就是如何通过在UI线程上调用new Handler()来创建新的UI线程处理程序。然后通过调用handler.post(Runnable)
  6. 将内容发布到该线程队列
  7. 我不相信他们会有所不同。但是必须深入研究源代码才能确定。
  8. 阅读文档总是有帮助的:

    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的类,它与我们在这里讨论的队列不同,但可以用来实现一个。