handler机制
2019-01-30 15:48:57 0 举报
android handle消息机制时序图
作者其他创作
大纲/内容
25.nativeWake
9.setForThread
15.next
1.main
3.new Looper
MessageQueue
11.将Looper设置为线程内共享
NativeMessageQueue
9.通过pthread_setspecific将mLooper设置为线程共享变量
2~4.quitAllowed false
native层
24.enqueueMessage
23.enqueueMessage
16.传入ptr让线程等待唤醒jni将ptr转换为NativeMessageQueue*
12.sMainLooper
19.pollInner
21.message
21.dispatchMessage
2.prepare
Looper
20.被唤醒后操作1. 判断当前需要执行的消息是否为同步屏障,如果是同步屏障,则在消息队列中将最接近的同步消息(sync)置位当前需要执行的消息,无同步消息也不会处理异步消息2.当前执行消息不为空,且到了执行时间则返回该消息3.如无需要执行的消息,则开始执行IdleHandles
handler
26.wake
12.设置主线程Looper
8a close(mEpollFd) 关闭之前的epollb 新建mEpollFdc 将mEpollFd加入mEpollFd
10.mPtr
26.向mWakeEventFd写入‘1’唤醒Epoll-mWakeEventFD
6.NativeMessageQueue
5.每个MessageQueue持有一个底层指针mPtr,记录native消息队列的信息nativeMessageQueue
14.进入死循环开始处理事务
10.将NativeMessageQueue地址指针强转为long返回
16.nativePollOnce
8.rebuildEpollLocked
20.线程被唤醒无返回值线程执行处理消息代码消息保存咋java层
22.postsendMessage
11.sThreadLocal.set
5.nativeInit
7. new Looper
24.加入消息丢列操作:1.根据消息的执行时间插入消息队列,先执行的在消息头2.判断是否需要唤醒线程执行消息队列 a.消息队列为空,且线程为阻塞状态(mBlocked = true) b.线程为阻塞,且消息队列中午同步屏障(SyncBarrier)
17.pollOnce
2.prepareMainLooper
android_os_MessageQueue
20.wake_up
7.创建mWakeEventFd
ActivityThread
14.loop
19.通过epoll进入阻塞
18.pollOnce
4.new MessageQueue
13.创建主线程通讯Handler内部类H
13.mH
15.获取下一条执行任务通过底层fd阻塞方法
0 条评论
下一页