Looper对文件描述符的监控与处理
上面提到的管道的读端是一种文件描述符,那么其他的文件描述符,如普通的文件、设备文件和套接字(包括套接字对)等的描述符,都可以被Looper用来监控,实现类似于上面的消息队列的唤醒和处理机制。通常,消息是通过消息队列发送的,也可以通过套接字(比如已建立好连接的套接字)、设备文件来发送;当然,也包括管道。对一个文件描述符进行监控后,只要有可I/O事件发生,那么调用了pollOnce的调用者(如某个线程)将被唤醒,然后就可调用指定的处理者(如回调函数)对到来的数据(若为可读事件的话)进行处理。
Looper提供了addFd函数用于添加需要监控的文件描述符,这个文件描述符由调用者指定,调用者还须指定对何种I/O(可读还是可写)事件进行监控。另外,也可指定用于处理可I/O事件时的回调处理函数(及其需用到的私有数据)。
可在LooperCallback的子类中重载handleEvent来实现对可I/O事件的处理。LooperCallback的定义如下(见文件Looper.h):
注意:如上述代码注释所示,当handleEvent返回0时,表示处理完后将注销对该文件描述符的监控,返回1将继续监控。也可实现如下类别(见文件looper.h,注意是小写,它是不同路径下的不同的文件)的回调函数,在其中实现对可I/O事件的处理,然后指定给addFd函数,代码如下:
事实上,该回调函数最终被封装到下面的类中(见文件Looper.h):
Looper的addFd函数的前半部分主要是检查传递进来的各个参数(见文件Looper.cpp):
后半部分则让epoll监控文件描述符(见下面的行440),若已存在,则修改替换(行447)。同时会新建一个文件描述符监控请求项request添加到Request列表mRequests中(行445)。若已存在,则替换原有项(行452)。
当有可I/O事件如有可读数据到来,则调用了pollOnce/pollInner的调用者将从pollInner中的epoll_wait的睡眠等待上醒来,开始执行后面的代码。如下面的pollInner的代码片段所示:
它首先检查是不是因为管道上有数据被唤醒,不是的话(行256处的else分支),则表示是采用addFd添加的文件描述符上有数据事件产生。在确定是来自哪个描述符监控请求项后(行257),再确定是何种事件(行260~263)。接着,将这些信息作为回复Response压入到回复队列中,pollInner后面的代码将对该队列继续处理。这样做,是为了对事件做出快速响应,记录下它后,后面再继续对事件做进一步处理。pollInner函数的后面代码片段如下:
因此,借助于Looper的pollOnce和addFd函数,可以实现对文件描述符的监控。无数据到来时pollOnce的调用者将睡眠等待,有数据到来时其被自动唤醒,并执行指定的回调处理者(若有的话)。
本文节选自《深入剖析Android系统》一书
杨长刚著
电子工业出版社出版
相关推荐
需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,使用Looper.prepare()和Looper.loop()创建了消息队列就可以让消息处理在该线程中完成。 使用Looper需要注意什么 写在...
Android 官方文档中对 Looper 的介绍中,Looper 被描述为一个用于运行消息循环的类,线程默认情况下没有消息循环,需要调用 prepare() 方法来创建消息循环,然后调用 loop() 方法来处理消息直到循环停止。...
在Android系统中,消息处理机制是至关重要的,它允许开发者在不同的线程间进行通信,尤其是主线程(UI线程)与其他工作线程之间。这一机制主要涉及到两个关键组件:`Looper`和`Handler`。下面我们将深入探讨这两个...
在Android系统中,消息机制是实现线程间通信的关键组件,而`Looper`与`MessageQueue`则是这一机制的核心部分。本文将深入探讨`Looper`的使用及其在管理`MessageQueue`中的作用。 首先,`Looper`是Android系统中一个...
`gulpfile.js` 是Gulp的任务配置文件,Gulp是一个自动化构建工具,通过编写简单的任务脚本,可以自动化处理诸如编译、压缩、合并等常见开发工作。 `bower.json` 和 `package.json` 分别记录了项目的Bower和npm依赖...
在本文中,我们将对Handler和Looper进行详细的解释,并探讨它们在Android系统中的作用。 一、Handler Handler是Android系统中的一种消息处理机制,它允许开发者在不同的线程中执行任务,并将结果返回到主线程中。...
总结起来,Android的消息处理机制是多线程协作的关键,而Looper作为消息循环的核心,对系统性能和用户体验有着直接影响。通过深入理解Looper的原理和源码,开发者可以更有效地设计和优化应用程序,避免UI卡顿等问题...
在Android系统中,Looper是消息循环机制的核心组件,它与Handler和Message紧密配合,使得应用程序能够实现线程间的通信。本文将深入探讨Looper的工作原理、使用场景以及如何在实际开发中应用。 首先,理解Looper的...
在Android系统中,`Looper`是一个至关重要的组件,它与`Handler`和`MessageQueue`共同构成了Android的消息处理机制。这个机制使得UI线程能够处理来自其他线程的异步消息,保持用户界面的响应性。这篇博客文章可能...
在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个关键组件,用于在后台线程和主线(UI)线程之间进行通信,处理异步任务和更新用户界面。下面将详细阐述这三个组件的工作原理以及如何使用它们。 **Handler...
Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...
消息会进入与该`Handler`关联的`MessageQueue`,然后在`Looper`的调度下被处理。`Handler`不仅可以发送消息,还可以执行Runnable对象,达到异步操作的效果。 `MessageQueue`则是消息队列,它是`Looper`从`Handler`...
Looper Count测试Looper个数工具apk
在Android开发中,Handler、Looper和MessageQueue是用于实现线程间通信的关键组件,它们共同构建了一个消息处理机制。理解这三个概念以及它们之间的关系对于优化应用程序的性能和响应性至关重要。 Handler(处理器...
《Looper对象的角色与应用解析》 在Android系统中,Looper对象扮演着至关重要的角色,它是消息处理机制的核心组件,使得Android应用能够实现异步消息的处理。本文将深入探讨Looper的工作原理及其在实际开发中的应用...
Handler是与Looper紧密关联的一个类,它用于发送和处理消息。在创建Handler时,需要传入Looper对象,这样Handler就能与指定的Looper绑定。通过Handler的sendMessage()或post()方法,我们可以向消息队列中添加消息,...
在Android系统中,Handler、Looper和Message构成了一个关键的消息处理机制,用于实现UI线程和其他线程之间的通信。本文将从源码的角度深入探讨这个机制,帮助开发者理解其内部工作原理。 首先,我们来理解Handler的...
它与 Looper 关联,可以发送 Message 到消息队列,并在适当的时间由 Looper 分发并处理这些消息。Handler 提供了 `sendMessage()` 和 `post()` 等方法来发送消息,同时提供了 `handleMessage()` 方法来处理接收到的...
Looper 类与 Handler 和 Message Queue 共同构成了 Android 的消息处理框架,它们之间的协同工作保证了应用程序能够高效地响应用户交互,并保持良好的性能表现。 #### 二、核心概念解析 **1. Looper** - **定义**...