Handler消息延时机制会阻塞嘛(补2019071902)

it2022-05-05  160

1.延时机制如何处理 Looper采用轮询的方式将message加入到messageQueue,然后loope不断的从messageQueue中取出message进行处理,那么如何从messageQueue中读取延时的message进行处理,handler没有处理,只是给在messagequeue中的message设置可target,target用于标记来源于那个handler,最终取出消息调用特定的handler. 如果延迟多个消息会将多个消息延时的时间做比较,时间短的先唤醒,在enqueueMessage方法中加入新的消息会先判断需不需要唤起线程,这样就不会一直阻塞(加入新的消息,唤起线程,就不需要等待上一个阻塞的消息) delay消息会一直阻塞线程,知道延时走完,或则下一个消息走来。

2.Handler 与Looper,MessageQueue的关系 (1)Looper:相当于消息的载体 他的内部有一个消息队列,也就是messagequeue,Handler发送的所有消息都会走向这个消息队列

looper.loop是一个死循环,不断的从消息队列messagequeue中取出信息,如果有消息存在就处理该消息,否则就阻塞

(2)Messagequeue :就是一个消息队列,可以向其中添加消息并处理消息

(3)handler其实就是发送消息处理消息的封装。它与looper相关联,也就是说在handler的内部可以找到looper,找到了looper也就找到了相应的消息队列。因此handler发送的消息都会走向messagequeue.

总结: Hanlder负责发送消息和接收looper传过来的消息,并根据消息处理相应的逻辑 Looper负责接收Handler发送过来的消息,并将该消息回传给Handler自己 MessageQueue只相当于一个消息容器

参考:https://blog.csdn.net/u010126792/article/details/85091348


最新回复(0)