Android Handler,Message, MessageQueue 和 Looper 的相关知识
当第一次被问到这个问题的时候,我就在想为什么会有这样的问题。经过回想,我才明白这个问题的答案其实很简单:Looper.loop()MessageQueue。那么为什么 Looper.loop() 不会卡死主线程呢?这是因为在 Android 系统中,当 Looper.loop() 开始执行时,它会自动创建一个新的线程来处理消息队列中的任务,这样就避免了主线程被阻塞的情况。
Linux pipe/epoll机制
在进入死循环之前,我们需要先了解 Linux pipe/epoll 机制。Pipe 是 Linux 下的一种通信机制,它允许两个进程之间进行双向数据传输。Epoll 是一种高效的 I/O 事件通知机制,它可以同时监控多个文件描述符的状态变化。
2. 在进入死循环之前创建了新 binder 线程,在代码 ActivityThread.main() 中,thread.attach(false); Looper.loop(); Looper.loop();
为了避免死循环导致主线程被阻塞,我们在进入死循环之前创建了一个新的 binder 线程。在 ActivityThread.main() 中,我们通过调用 thread.attach(false) 方法来实现这一点。接下来,我们分别调用两次 Looper.loop() 方法来启动消息循环。这样做的好处是即使死循环中的任务无法及时完成,也不会影响到主线程的正常运行。
死循环会特别消耗CPU资源吗?Linux pipe/epoll机制Linux pipe/epoll机制
死循环会导致 CPU 资源的过度消耗,因为它会让程序陷入一个无限循环的状态,不断地执行任务而无法得到响应。而 Linux 下的 Pipe 和 Epoll 机制则可以有效地解决这个问题。通过这些机制,我们可以实现高效、可靠的 I/O 通信方式。
ANR(应用无响应)
如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR)错误。如果应用位于前台,系统会向用户显示一个对话框。ANR 对话框会为用户提供强行退出应用的选项。下面是 ANR 在官方文档中的介绍:
ANR 如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR)错误。如果应用位于前台,系统会向用户显示一个对话框。ANR 对话框会为用户提供强行退出应用的选项。