Handler 消息机制源码分析(一)

学习Handler 需要掌握ThreadLocal、Linux内核的IO复用 epoll
配合源码一起看更好
书籍:深入理解Android

一、ActivityThread main方法

Looper初始化

在这里插入图片描述

1.Looper.prepareMainLooper

在这里插入图片描述
在这里插入图片描述

2.Looper.loop方法

在这里插入图片描述
loop 方法非常重要 他主要2件事

  1. 从MessageQueue.next 读取消息对象
  2. 调用Message.target.dispatchMessage 就是handler的dispatchMessage

二、Handler如何存入消息的

1.Handler.sendMessage方法 enqueueMessage方法

在这里1图片描述
在这里插入图片描述
这里 把 msg.target = handler,注意的是如何获取的主线唯一的MessageQueue 看Handler构造方法就可以了,mQueue = Looper.myLooper().mQueue(非主线程去调用Looper.myLooper会报错,ThreadLocal.get == null)后面会讲述非主线程怎么使用Handler

2.MessageQueue.enqueueMessage

在这里插入图片描述
在这里插入图片描述
这里最主要的两件事情就是
1.维护Message 中单链表 msg.when最小的是消息头
2.判断是否唤醒

三、MessageQueue.next 如何取消息

在这里插入图片描述
特别注意这个 nextPollOnce,next方法会阻塞在这里
在这里插入图片描述
在这里插入图片描述

四、MessageObtain 方法是没有对象池的

在这里插入图片描述
我们自己调用Message.obtain 中是没有对象池的 每次都会给你返回一个 new Message
可以打断点看一下 对象池的使用是Android Framework层自己用的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值