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函数,代码如下: