Handler原理分析
2022-08-18 20:52:35 17 举报
AI智能生成
登录查看完整内容
用思维导图的方式整理Handler的全部逻辑,包括发送,消费消息。Looper无限for循环的底层实现逻辑
作者其他创作
大纲/内容
设置message的target
调用MessageQueue的enqueueMessage
入队messageQueue
enqueueMessage
sendMessageAtTime
send系列
将Runnable赋值给Message的callback
getPostMessage
1,将Runnable转化成Message
2 调用send系列
3 最终调用sendMessageAtTime
外框
post系列
过程同上
发送消息
message.callback.run();
handleCallback(Message message)
Message的callback不为null,说明是Runnable类型的消息
Handler子类自己实现
handleMessage
callback为空
dispatchMessage
接收消息
Handler类
Looper.prepare()系列
Looper.prepareMainLooper()
创建
MessageQueue.next()
获取消息队列中的Message
msg.target.dispatchMessage()
消费Message
msg.recycleUnchecked()
回收Message
Looper.loop()
运转MessageQueue
Looper.quit()
Looper.quitSafely()
退出
Looper
mPtr = nativeInit(); native层构建native消息队列
native层创建epoll对象
epoll注册监听唤醒事件文件描述符的读操作
Looper构造方法里调用 new MessageQueue()
构建
以单链表的形式,根据when按照从小到大的顺序来确定MessageQueue中Message的排列顺序
需要唤醒线程的话,调用nativeWake(),向管道写入字符‘1’,唤醒线程
入队
内部无限for(;;)循环
判断当前消息队列队首是否target==null,是的话,说明是同步屏障消息,接着找到它后面的第一个异步消息,如果没有异步消息的话,设置nextPollTimeoutMillis=-1,阻塞
如果message.when>now,设置超时时长message.when-now
message.when<=now,返回message
当前消息队列队首消息不是同步屏障消息
提取Message
next()
出队
设置同步屏障消息postSyncBarrier
去除同步屏障消息removewSyncBarrier
同步屏障消息
只在Choreographer里使用,发送同步屏障消息后,一般会再跟一条异步消息。因为同步屏障消息后,只有提取异步消息
MessageQueue
Handler原理分析
0 条评论
回复 删除
下一页