一、MessageQueue 构造方法
1.android_os_MessageQueue.cpp 中初始化
android_os_MessageQueue_nativeInit(void)
MessageNative 的初始化 以及返回mptr
初始化做了什么
- 创建NatvieMessage
- 创建Looper对象 (根据当前线程 有点像ThreadLocal)
- 返回mPtr 指针 指向的就是这个NativeMessage对象
2.Looper初始化做了什么
这个 Looper 构造方法 做了三件事
- mWakeEventFd 事件文件描述符
- epoll_create 创建epoll 句柄
- epoll_ctl 把fd 加入epoll中 参数看注释 (eventItem 就是一个结构体 放入了fd 和 EPOLLIN)
二、MessageQueue.next 阻塞在nativePollOnce
根据传入的mPtr 参数获取 NativeMessage对象
调用looper对象的 pollOnce 注意这里的pollOnce 是Looper.h 头文件的内联函数 pollOnce
1.Looper.cpp pollOnce(4个参数)
死循环中调用 pollInner
epoll_wait 是阻塞的(Looper真正的阻塞就是发生在这里)就是等待write(fd)
等待fd文件描述符中数据,返回值在eventItems中,timeOut超时时间
三、MessageQueue.enqueueMessage唤醒 nativeWake
wake方法非常简单就是 在fd 中写入一个 1数据 就能唤醒 epoll_wait