为什么 Looper.loop() 不阻塞主线程



Looper 的循环方法在 ActivityThread 的主方法中调用,并启动一个遍历消息队列的无限for loop。当队列中没有更多消息时,它会调用等待下一条消息nativePollOnce方法。
所以我的
问题是 1.如果它等待下一条消息,那么主线程将被阻止,那么它如何排队更多消息队列。
2.如果它没有被阻止,那么它将消耗 CPU 周期,其他人将没有机会在队列中添加消息。
请考虑 MessageQueue、Handler、Looper 位于主线程和 UI 事件以及由主线程处理的输入事件上。
链接
为什么主线程的 Looper.loop(( 不阻止 UI 线程?
为什么 Looper.loop(( 不阻止 android 的 UI 线程
- 什么是消息队列原生轮询?
Android Looper 线程是否使用处理能力?

消息不需要由主线程本身排队。Handler的主要用例之一是将消息发布到另一个线程。例如:

  1. 在主线程上创建一个Handler,以便将其绑定到主线程的 looper。

  2. 将其交给另一个线程,该线程可以发布要由主线程处理的消息。

这很常见,每个Activity都会创建自己的HandlerActivity.runOnUiThread()用于从后台线程发送 UI 任务。

如果它等待下一条消息,那么主线程将被阻塞,那么它如何排队更多的消息队列?

主线程仅运行主循环。其他一切都在主循环本身内运行。因此,如果此循环正在等待新消息,则主线程上根本没有其他代码运行。这也意味着不可能从主线程本身对任何新消息进行排队。

如果它没有被阻止,那么它将消耗 CPU 周期,其他人将没有机会在队列中添加消息。 请考虑 MessageQueue、Handler、Looper 位于主线程和 UI 事件以及由主线程处理的输入事件上。

主线程处于阻塞状态,直到收到消息。此阻止机制在本机层上实现,因此针对性能进行了优化。

MessageQueueHandler只是不直接连接到任何线程的数据结构。

本文非常清楚地描述了这个主题,或者你可以看到这个答案。

总结:

Looper 是一个非常基本的包装类,它将 MessageQueue 附加到 线程化并管理此队列。消息队列是一个结构 顺序化线程的同时处理请求。 在 Android,消息/请求处理类,如Handler使用Looper 来管理它们各自的消息队列。

相关内容

  • 没有找到相关文章

最新更新