Android 消息机制
2020-05-20 17:39:17 0 举报
Handler
作者其他创作
大纲/内容
15. sendMessageAtTime()
19. wake()
Handler.java
备注:prepareMainLooper():1. prepare();2. mainLooper 赋值给sMainLooperprepare():1. construct2. Looper设置给sThreadLocal,后续Looper从ThreadLocal中取出
ActivityThread.java#main()
附:空闲处理者空闲处理者:没取到可执行消息--> 下次for循环进行随眠的之间的时间间隔叫空闲时间,在空闲时间处理事务的对象,称之为空闲处理者1. 空闲处理者使用 IdleHandler 接口描述空闲处理者通过 MessageQueue.addIdleHandler() 添加空闲处理者使用 MessageQueue.mIdleHandlers 维护
6. Looper.loop();
MessageQueue(native)
1. Looper.prepareMainLooper();
11. pollInder()
2. prepare()
7. MessageQueue.next()
1. 发送消息:sendMessage()等send方法
MessageQueue.java
Looper.java
Handler的基本总结及注意事项:1. 子线程需要创建Looper,并且建议在消息处理完退出looper:Looper.quit()/quitSafly()2. 主线程的Looper不能被退出
- Looper.cpp constructorspan style=\"font-size: inherit;\
16. enqueueMessage()将该消息的target设置为this自身调用MessageQueue.enqueueMessage
18. nativeWake()
备注:1. 若msg中存在callback,则调用Handler.handleCallback()2. 若Handler设置了Callback,若callback.handleMessage返回值是true,则消息不会继续向下分发3. 若消息没有被callbacl拦截,则调用handleMessage进行最后的处理1. 比如Handler.post()内部就是一个带callback的message2. Handler构造方法中传入了Callback3. 子类重写
4. construct备注:android_os_MessageQueue_nativeInita. 创建NativeMessageQueueb. 对nativeMessageQueue强引用c. return 给java层
备注:pendingIdleHandlerCount空闲事件处理者的数量nextPollTimeoutMillis当前线程没有消息处理时可睡眠时间死循环获取可执行的Message1. nextPollTimeoutMillis不为零,距离可执行Message有一定时间,在空闲时间执行Binder相关的指令2. nativePollOnce() native层检查msg可读,无会执行休眠3. 取出队列中的Message,返回出去 3.1 移除队列中无效的Message 3.2 取队首有效的Message,如果当前时间早于执行时间,给nextPollTimeoutMillis赋值,指定可睡眠时间,若可以立即执行,则将此消息返回出去 3.3 队列中无消息可以给nextPollTimeoutMillis=-1 无限休眠,直到被唤醒4. 获取空闲事件处理者(见备注)5. nextPollTimeoutMillis=0 空闲处理期间可能有新的Message入队,将睡眠时间置为0
8. nativePollOnce()
3. construct备注:1. native#nativeInit()2. 获取当前Thread
Handler结构:1. construct2. sendMessage3. handleMessage
17. MessageQueue.enqueueMessage()
MessageQueue.enqueueMessage()备注:1. 队列为空/入队立即执行/入队执行时间早于队首消息的执行时间,将消息插在队首,并变更当前的neeWake状态2. 入队执行时间晚于队首消息执行时间,循环对比插到合适的位置3. 如果需要唤醒,处理该消息队列绑定的线程的唤醒操作nativeWake
10. pollOnce
19. Looper.wake()
备注:1. Looper.pollOnce()2. 死循环读取消息,读到return result,如果没读到消息,执行pollInner3. 调用epoll_wait监听pipe中的IO事件,无事件,则睡眠在文件读操作上,时长就是由传递过来的nextPollTimeoutMillis决定4. 睡眠结束后,获取文件描述,若为唤醒的文件描述,则执行唤醒awoken
Looper.wake()向Looper绑定的线程pipe管道写入一个新的数据来唤醒目标,然后就可以将pollOnce中的epoll在读操作上的睡眠停止
Looper(native)
14..Handler.dispatchMessage()
/system/core/jni/android_os_MessageQueue.cpp
备注:1. 获取调用线程的Looper对象2. 从Looper中获取对应的消息队列MessageQueue3. 通过死循环,不断的处理消息队列中的数据取出:MessageQueue.next处理Handler.dispatchMessage4. 取出的message为null时退出循环(可能是Looper被quit)
12. epoll_wait()
9. NativeMessageQueue->pollOnce
13. awoken()
收藏
0 条评论
回复 删除
下一页