Handler 消息机制源码分析(二)epoll IO复用

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值