Android Handler机制
2022-08-28 19:35:47 0 举报
AI智能生成
Android Handler机制
作者其他创作
大纲/内容
是Handler和MessageQueue交互的桥梁
消息轮询器,轮询获取MessageQueue里Message,然后分发出去
唯一只能创建一次
Thread类下ThreadLocalMap
线程本地变量static final ThreadLocal<Looper> sThreadLocal
主线程looper唯一
static Looper sMainLooper
获取当前线程Looper
myLooper()
创建Looper到当前线程ThreadLocal
若已创建过抛RuntimeException
prepare(boolean quitAllowed)
死循环不断轮询MessageQueue
Message msg = queue.next()
代表quit调用,直接return
msg为空?
找到target的Handler分发消息
msg.target.dispatchMessage(msg)
回收msg到对象池
msg.recycleUnchecked()
loop()
移除消息队列所有消息
quit()
移除消息队列未来的消息,保留正在处理消息
quitSafely()
mQueue = new MessageQueue(quitAllowed)
mThread = Thread.currentThread()
构造方法Looper(boolean quitAllowed)
Printer mLogging
Looper
Message
单例的消息回收池,回收池最大50个
通过recycleUnchecked()释放Message实例,并保存到回收池里,方便以后复用,并减少GC
可以使用obtain()从回收池复用消息,回收池移除此消息
static Message sPool
消息节点
Message mMessages
轮训获取下个消息
使用Linux高效的IO多路复用机制epoll
优先遍历获取异步消息分发(isAsynchronous)
同步屏障消息
若msg != null && msg.target == null
等待消息equeue时唤醒
线程一直阻塞
若消息为空,nextPollTimeoutMillis = -1
线程阻塞nextPollTimeoutMillis
若消息未达到执行时间,nextPollTimeoutMillis = msg.when - now
msg.markInUse()
message出队
若消息达到执行时间
Message next()
removeAllFutureMessagesLocked()
if (safe)
removeAllMessagesLocked()
else
唤醒线程
nativeWake(mPtr)
quit(boolean safe)
返回token
添加同步屏障消息
int postSyncBarrier()
移除同步屏障消息
removeSyncBarrier(int token)
MSG_DO_FRAME
MSG_DO_SCHEDULE_VSYNC
MSG_DO_SCHEDULE_CALLBACK
Vsync间隔UI刷新消息
MSG_SEND_INPUT_EVENT
点击事件消息
异步消息举例
消息入队,由Handler的sendMessage调用
一个Interface,用于消息空闲时可处理自定义任务的机制
空闲时GC
GcIdler
自动化插桩测试也使用这个机制
外部使用Looper.myQueue().addIdleHandler添加
可以实现此接口实现自定义任务
返回true,下次继续执行
返回false,IdleHandler会被remove掉,以后不执行
boolean queueIdle()
mMessages == null || now < mMessages.when
isIdle()是否空闲
ArrayList<IdleHandler> mIdleHandlers
IdleHandler[] mPendingIdleHandlers
IdleHandler
MessageQueue
Handler机制
收藏
0 条评论
回复 删除
下一页