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