opoojkk

重新理解Android事件分发机制

lxx
目次

在 Android 中,应用程序存在一个主线程(Main Thread),也被称为UI 线程。所有与界面相关的操作(如刷新 UI、响应点击)都必须在这个线程上完成。其实不仅是 Android,像 JavaScript 这样的前端运行环境也采取了类似的单线程设计。

为什么要用单线程处理 UI? #

这样做的好处是显而易见的:

换句话说,UI 层面采用单线程串行化处理,既简化了模型,又提升了性能和稳定性。


Looper 与事件异步机制 #

Android 中的 Looper/MessageQueue 机制几乎是 Android 面试必问的内容。简单来说,Looper 通过一个消息循环(Message Loop),让事件变成异步执行。

其中有一个关键点是 同步屏障(Sync Barrier)


Looper 的阻塞与唤醒 #

当 Looper 在消息队列中取不到下一个要处理的事件时,它并不会忙等浪费 CPU,而是进入阻塞状态。 这里 Android 使用的是 epoll 机制,而不是更传统的 selectpoll


select、poll 与 epoll 的区别 #

epoll 的两个核心优化点:

  1. 减少用户态与内核态之间的开销:只需传递发生变化的 fd,而不是整个集合。
  2. 避免轮询遍历:内核会主动通知哪些 fd 就绪,应用层只需处理这些就绪事件。

总结 #

参考 #

标签:
Categories: