(笔记)关于Handler机制中looper Message的一些理解

handler在接受/处理消息需要looper来管理,每个主线线程在创建开始都会自动创建一个looper,通过Looper.loop(); 来进行消息循环,对整个activity的生命周期中的事件进行接收和处理。

Looper在创建开始的构造方法中创建了关联的MessageQueue,它是以队列形式管理Message,发送无延时的message是先进先出,但是通过sendMessageAtFrontOfQueue()可以把消息放到头部优先执行,而且message有延时发送这个形式,因为其内部是通过单链表来储存message的,方便插入和删除消息。

消息队列工作流程:如果发送一个延时10s的消息A放到队列中,looper开始循环所以MessageQueue发现这是个延时消息,保存延时时间,调用
nativePollOnce(ptr, nextPollTimeoutMillis)阻塞(这个nextPollTimeoutMillis参数就是阻塞时间,方法会在时间到时唤醒线程),Looper阻塞,不对A进行处理,此时又有一个延时5s的消息B要加入队列,判断A还未到时间,把B插入到队列头部(A的前面),调用nativeWake()方法唤醒线程,之后MessageQueue发现B也是个延时消息,同A一样处理,现在把无延时消息C加入队列,根据mBlocked标识判断队列中有消息未到时间在阻塞当中,把C插入头部,唤醒线程,looper处理,并把C移除队列,之后looper又开始循环调用next();MessageQueue发现B没到时间继续阻塞,looper阻塞,一直到到B时发现时间到了,唤醒线程,就把B处理并移除,A也同B一样,此时looper循环发现队列中没有消息了就一直阻塞不再循环,知道有新消息插入再次唤醒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章