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