Handler原理
2023-12-28 19:44:41 0 举报
Handler(处理者)是Android操作系统中的一个重要组成部分,用于处理异步消息。Handler的原理主要包括三个关键部分:Message、Looper和Handler自身。 Message: 是一个用于传递消息的类,包含了描述信息类型、数据的字段,以及回调方法(用于处理信息)。Message被Handler发送、处理。 Looper: 是一个实现无限循环的类,负责从MessageQueue中提取Message,并将它们分发给对应的Handler处理。Looper为线程创建MessageQueue,并开启无限循环。 Handler: 是一个处理信息的类,用于发送和接收Message。Handler将Message发送给Looper的MessageQueue,并在Looper分发Message时回调Handler的handleMessage()方法处理信息。 Handler原理使得Android能够在不同线程之间进行异步通信,提高应用性能和响应速度。
作者其他创作
大纲/内容
结束不再继续插入msg
主线程中,实例化一个looper对象Looper.prepareMainLooper()
N
拿出looper中的MessageQueue对象
Y
调用Runnable的run方法
查看现在是否存在IdleHandler
告知JNI,插入了一个新的msgnativeWake
messageQueue.next拿取需要执行的message对象
停止循环,退出
拿到的msg是NULL?
调用方法handleMessage
enqueueMessage
插入msg对象
for循环continue
说明looper.prepare还没被调用
直接返回NULL
调用message对象中保存的Handler对象的dispatchMessage 方法
找到了?
Loop
抛出异常,表示需要先调用prepare()
从消息队列中找合适的Message对象
是否已经停止了looper
再判断Handler中实例化时候是否传了Callback回调
这个方法会阻塞,等待一定的时间继续执行,方法会传等待多久,单位毫秒,等待时间即为下一个message的期望开始执行的时间,如果队列中message为空,那么这里为-1,除非被nativeWake方法唤醒,否则一直等待
通过ThreadLocal拿到当前线程的looper
根据消息传入时候的时间+需要delay的时间确定该message对象在队列中的位置
如果needWake是true
遍历执行所有的IdleHandler
如果callback接口的handleMessage返回false,那么还会继续执行handler的handleMessage方法
new Handler
sendMessage()
触发callback回调方法
会先判断,该looper是否是Restart的
Looper调用方法quit停止后,不支持重新调用loop重新使用
nativePollOnce()
MessageQueue内部是通过维护Message链表结构,来维护message队列,所以插入msg也就是插入到链表的对应位置
对于主线程,实例化后的looper直接作为静态变量保存到Looper类中,同时也会保存到SThreadLocal中
普通线程中,实例化一个looper对象Looper.prepare()
开启for死循环
是否成功拿到?
1. 如果当前队列是空的,那么needWake是true2. 当前queue队列是闲置状态,那么needWake是true(闲置状态包括,有些msg还没有其执行的时间点,比如设置了延迟执行)
返回对象,结束循环
先从SThreadLocal中拿取looper对象
looper.loop()
优先判断Message中的Runnable是否为NULL
通过判断ptr是否为0来判断,ptr代表需要读取队列中的哪个message,初始化不会是0,只有在dispose时候才会置为0
对于普通线程,自己实例化出来的looper,会保存到sThreadLocal中,该local静态保存在Looper中
0 条评论
下一页