想了解更多关于Android UI线程的信息';s事件队列

想了解更多关于Android UI线程的信息';s事件队列,android,events,Android,Events,在整个web和堆栈溢出中,都有对UI线程的事件队列的引用。例如,runOnUiThread()将向UI线程的事件队列发布一个操作。但是我还没有找到这个队列的详细描述,所以请有人给我指出一个详细的队列,或者回答几个问题 1.我知道这是一个队列,它包含“动作”,但我有点不清楚“动作”是什么。动作是带有相关参数的方法调用,还是线程本身的指令,还是什么 2.所有线程都有事件队列还是只有UI线程 3.如何查看事件队列中的内容或获取事件计数 4.什么确切地确定队列中的操作何时执行 5.视图类有一个名为can

在整个web和堆栈溢出中,都有对UI线程的事件队列的引用。例如,runOnUiThread()将向UI线程的事件队列发布一个操作。但是我还没有找到这个队列的详细描述,所以请有人给我指出一个详细的队列,或者回答几个问题

1.我知道这是一个队列,它包含“动作”,但我有点不清楚“动作”是什么。动作是带有相关参数的方法调用,还是线程本身的指令,还是什么

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

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

4.什么确切地确定队列中的操作何时执行

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


6.消息队列和事件队列是两个不同的队列吗N.B.-有人问了这个问题,回答者开始说它们是同义词,然后附加了一个附录,似乎暗示信息不同,所以我不清楚最终的答案是什么

它只是一个标准的消息循环,就像每个GUI平台使用的一样。“事件”是CS术语,不是特定对象。想象一下,在Android框架内,您会看到如下内容:

MessageQueue queue;
void run(){
    while(1){
        queue.waitForEvent();
        Message msg = queue.getEvent();
        //Handle msg
    }
}
只有UI线程有一个事件循环,尽管您可以在另一个线程上编写自己的事件循环

无法查看事件队列或获取事件列表。您需要了解的内容将调用代码中的某些函数

事件会在线程可以执行时立即执行。如果队列中没有事件,线程将休眠。它们应该按顺序执行,尽管框架可能会在某些事件上作弊

消息队列和事件队列是相同的。还有一个名为MessageQueue的类,它与我们在这里讨论的队列不同,但可以用来实现一个

  • 这是一个有可运行程序的队列。线程调用
    run()
  • 只有调用
    Looper.prepare()
    的线程,因此任何线程都可能拥有它们。“无法在未调用Looper.prepare()的线程内创建处理程序”存在运行时异常
  • 你不能。Stuff由平台管理,并调用活动回调、片段回调、调度触摸事件、运行动画、运行布局、测量和绘制。所有这些都在UI线程中完成
  • 好吧,这是先进先出。但这一点我可能错了
  • 视图具有UI线程的处理程序。处理程序绑定到线程及其MessageQueue。这就是通过在UI线程上调用
    newhandler()
    来创建新UI线程处理程序的方法。然后通过调用
    handler.post(Runnable)
  • 我不相信他们有什么不同。但必须深入研究源代码才能确定
  • 阅读文档总是很有帮助的:


    On#4我同意,作为一个队列,可能是FIFO,但我不清楚什么时候执行。例如,当您调用notifyDataSetChanged()时,它将安排一个布局过程,我假设事件quese与此有关。但是,当你在UI线程中“同时”做任何其他事情时,这种情况何时会发生?换句话说,是什么触发系统从事件队列中抓取下一个项目?因为我从来没有深入研究过它,所以我只能想象和猜测。我最好的猜测是,有两个主要元素将事件分派到UI线程。使用invalidate、requestLayout、notifyDataSetChanged等和创建触摸事件并发送到窗口的触摸界面驱动程序查看/可绘制文件/etc(因为它们想要绘制)。如前所述,这些都是FIFO中的队列。这就是开发人员不能阻塞UI线程的全部原因,并且永远不要做需要超过几毫秒的事情,特别是在滚动期间。所有这些事件都将在队列中被阻止。为了回答最后一个问题:
    EventQueue.size()>0使线程唤醒并进入调度程序。调度程序(可能)是Linux调度程序,这里Dianne Hackborn对线程优先级、调度进行了很好的讨论: