Looper中的睡眠等待与唤醒机制
C++类Looper中的睡眠和唤醒机制是通过pollOnce和wake函数提供的,它们又是利用操作系统(Linux内核)的epoll机制来完成的。当被监控的文件(通过epoll_ctl的EPOLL_CTL_ADD添加进去)可I/O时,epoll_wait调用会从睡眠中醒来,这时,可以检查是哪个(或哪些)文件描述符对应的文件可以进行I/O读写了,从而做出进一步处理。使用者利用它们就可以拥有睡眠等待和唤醒机制。下面详述。
在Looper的构造函数中,会创建一个管道(下面的行73),然后调用epoll_create获取一个epoll的实例的描述符(行88),最后将管道读端描述符作为一个事件报告项添加给epoll(行95)。这样,当管道读端有数据可读时,将会得到报告。Looper的构造函数如下(见文件Looper.cpp):
Looper的pollOnce函数将最终调用到其pollInner函数。在后者里面,将调用epoll_wait睡眠等待其监控的文件描述符是否有可I/O事件的到来,若有(哪怕只有一个),epoll_wait将会醒来,然后可检查是哪个文件描述符上的可I/O事件。pollInner函数中的相关代码如下(见文件Looper.cpp):
可见,在线程循环中调用了Looper的pollOnce函数,将导致睡眠等待在上面的行218处的epoll_wait上。当向消息队列发送消息并进行唤醒时,行218将被唤醒,因此从pollOnce函数中返回,可以从消息队列中取出消息进行处理。
Looper的wake函数用于向管道中写入字符(下面的行367),以唤醒pollOnce:
下面来看一下Java层的MessageQueue如何利用这种机制。
前面提到在android.os.MessageQueue的next函数中取出下一个消息时,会调用到native层实现的函数nativePollOnce时,实际调用到了如下native实现(见文件android_os_MessageQueue.cpp):
上面行157的pollOnce函数代码是(见文件android_os_MessageQueue.cpp):
这样,它们就通过Looper的pollOnce实现了在Looper中的管道上的读端上的睡眠等待。
当android.os.MessageQueue的enqueueMessage函数往队列上添加了一个新消息或removeSyncBarrier移除了同步屏障后,可能需要调用nativeWake唤醒,其native实现为:(见文件android_os_MessageQueue.cpp):
上面的行162调用的又是下面的函数,代码如下(见文件android_os_MessageQueue.cpp):
这样,Looper将向管道写端写入字符,唤醒其在管道读端上的睡眠等待。
因此,通过借助于Looper的wake和pollOnce函数,可以让别的消息队列(如Java层的消息队列)拥有睡眠唤醒机制:没有消息时pollOnce调用者将睡眠等待,有消息时让wake函数去唤醒睡眠等待。
本文节选自《深入剖析Android系统》一书
杨长刚著
电子工业出版社出版
相关推荐
Looper是Android系统中的一种消息循环机制,它可以将消息发送到消息队列中,并等待消息的处理。 二、Looper Looper是Android系统中的一种消息循环机制,它可以将消息发送到消息队列中,并等待消息的处理。Looper的...
Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper....
在Android系统中,消息处理机制是至关重要的,它允许开发者在不同的线程间进行通信,尤其是主线程(UI线程)与其他工作线程之间。这一机制主要涉及到两个关键组件:`Looper`和`Handler`。下面我们将深入探讨这两个...
在 run() 方法中,我们首先调用 Looper.prepare() 方法来创建 Looper 对象,然后创建一个 Handler 对象,并将其与 Looper 对象关联。最后,我们调用 Looper.loop() 方法来处理消息循环。 通过使用 Looper 对象,...
在Android系统中,消息处理机制是应用程序中线程间通信的一种关键方式,它涉及到Handler、Message和Looper等组件。本文将深入探讨“消息循环”Looper及其源码解析,帮助开发者更好地理解和应用这一机制。 首先,...
所以在按按钮后,会等待3s后显示VIEW才会有打印输出,如果理解了Looper的同步机制后,可以删除3s等待和主线程中的post runnable使这个示例程序跑起来更加顺畅。希望对于Android初学者有所帮助。
这些消息会被添加到MessageQueue中,等待Looper取出并交给Handler处理。 此外,还可以使用HandlerThread类,这是一个内置了Looper的线程,简化了上述步骤。只需要创建一个HandlerThread对象,调用其`start()`方法,...
在Android系统中,消息机制是实现线程间通信的关键组件,而`Looper`与`MessageQueue`则是这一机制的核心部分。本文将深入探讨`Looper`的使用及其在管理`MessageQueue`中的作用。 首先,`Looper`是Android系统中一个...
每个`Handler`都会有自己的`MessageQueue`,并且当`Handler`发送消息时,消息会被添加到这个队列中,等待`Looper`取出并分发。 现在,让我们结合`android Looper demo`的场景来看这些概念的应用: 1. 主线程内消息...
在Android系统中,Looper是消息循环机制的核心组件,它与Handler和Message紧密配合,使得应用程序能够实现线程间的通信。本文将深入探讨Looper的工作原理、使用场景以及如何在实际开发中应用。 首先,理解Looper的...
总之,`Looper`是Android系统中的核心组件之一,它与`Handler`和`Message`共同构建了强大的异步处理机制。理解和熟练运用`Looper`,对于开发高效、流畅的Android应用程序至关重要。通过阅读指定的博客文章,你可以更...
在Android系统中,Handler、Looper和Message构成了一个关键的消息处理机制,用于实现UI线程和其他线程之间的通信。本文将从源码的角度深入探讨这个机制,帮助开发者理解其内部工作原理。 首先,我们来理解Handler的...
**Handler** 是Android中的消息处理机制,它允许开发者在不同的线程间传递消息。通常,在主线程中创建一个`Handler`实例,然后在其他线程中通过`Looper`发送消息到这个`Handler`。`Handler`会接收到消息,并调用相应...
在Android系统中,Looper对象扮演着消息循环的重要角色,它是Android消息处理机制的核心组件之一。本文将深入探讨Looper的工作原理,以及如何在实际开发中利用它来实现高效、异步的事件处理。我们将通过一个名为...
我们可以通过Handler发送消息,这些消息会被添加到Looper的消息队列中,等待主线程按照顺序处理。 接下来是Thread(线程)。在计算机科学中,线程是程序执行的独立路径。在Android系统中,每个应用程序都有一个主线...
在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...
Looper Count测试Looper个数工具apk
当 Handler 发送消息时,消息会被添加到 MessageQueue 中,等待 Looper 取出并分发。MessageQueue 本身不处理消息,只是负责管理消息的顺序。 在上述例子中,`LooperThreadActivity` 创建了一个 `CustomThread` ...
在Android开发中,消息机制是一个非常重要的概念,它由多个核心组件组成,包括`Handler`、`Message`、`Looper`等。这一机制支持了应用程序内部以及应用程序间的通信。下面将详细介绍这些组件的功能与协作方式。 ###...