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和handler类详解
Looper Count测试Looper个数工具apk
bootstrap-looper 模版 bootstrap-looper 模版 bootstrap-looper 模版
Handler,AsyncTask,Looper自定义线程使用示例,自定义线程与UI线程交互,访问UI线程控件
android源码中包含了大量的设计模式, 除此以外, android sdk还精心为我们设计了... 其实还有一个Message Queue(消息队列) , 但是MQ被封装到Looper里面了, 我们不会直接与 MQ打交道, 因此我没将其作为核心类。
在主线程即UI线程外,新建一个Looper线程,并用Messenger和Handler来处理message和posted runnable。程序中,在负线程中默认加了一个3s的线程等来,来帮助理解sent message和post runnable之间的同步机制。所以在按...
handler与looper及messagequeue的简单总结
Android Looper的详细介绍,、android初学者可以下载来看看
Android 消息处理机制之四: 消息循环 Looper 及其源码解析 http://blog.csdn.net/ahuier/article/details/17103517
关于Looper的使用,可以在任意2个线程间通讯。
Handler和looper详解.
这次项目用到的主要是Handler Thread Looper,希望对这三者关系还不是很清楚的人能通过我的项目读懂,当然我也不敢保证一定能
可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息. 3、Looper: 是Handler和消息队列之间通讯桥梁,程序组件首先通过...
个人购买的资源,仅供学习使用,请勿用做商业用途,流行的Bootstrap框架,用于后台管理,风格简约
Looper、Handler与HandlerThread相关概念与简介
Handler+Looper+MessageQueue
http://blog.csdn.net/lindonglian/article/details/43316239 不使用默认的looper
android looper handler 子线程 主线程详解
android event handler and looper