Android消息循环

来源:互联网 发布:阿里在线编程 编辑:程序博客网 时间:2024/06/05 20:30

Android的消息循环由Looper、MessageQueue、Message、Handler组成,Looper和MessageQueue是内部的,驱动消息循环运转的部件,Message和Handler是外部使用的,外部通过Handler向消息循环系统发送消息和或者删除消息。

Message有一个时间属性,这是一个很重要的属性,因为它表明了Message将在什么时候被发送给接收者,这个时间不是日历时间,而是从设备开机后消逝的时间(SystemClock.uptimeMillis)。

Handler负责将Message插入到MessageQueue中,并且也扮演了Message的接收者的角色。

MessageQueue按队列的形式组织Message,并且按Message的时间给队列中的Message排序,时间近的排在前头,时间晚的排在后头。

所以当向MessageQueue插入一个Message时,会遵守这个按时间的排序规则,找到合适的位置把Message插进去,而不是简单地插在队列的尾部。

当从MessageQueue中取一个Message时,由于Message都按时间排了序,所以取出队列前头的第一个消息,然后查看它的时间到点了没有,如果到点了或者错过了就把它取出来,如果还没有到点,那就看看还需要等待多长时间到点,然后就等待那么长时间再把它取出来。

在等待的过程中,消息循环所在的线程是睡眠的,如果这个时候又有消息插入进来,那么就唤醒这个线程,让它按照上面的方式再取一次消息,如此反复直到有某段代码主动停止了这个消息循环。如果MessageQueue中没有消息,那么就会无限地等待下去,直到某个被插入进来的消息唤醒了它。

Handler可以向MessageQueue插入延时消息,其实就是把Message的时间设定在未来的某一个时刻,然后插入到MessageQueue中,MessageQueue按照上面的方式取消息时,就会在那个时刻把消息取出来。

Looper是负责分发消息的,从MesasgeQueue中取出的Mesage是要交给Looper的,Looper将得到的Message发送给正确的接收者。为什么Looper不会把消息发错呢?因为Message上已经写明了谁是接收者。

为了让多个线程也能往这个线程发送消息,MessageQueue被赋予了线程安全的能力,它能保证在多个线程同时向它发送消息或删除消息时不会出问题。

Looper分发消息的过程和向MessageQueue插入消息的过程时相互独立的,谁也影响不了谁。Looper在分发消息时可能因为接收者处理得比较慢,这个时候要等上一会,但不会影响其他线程往MessageQueue插入消息,其他线程不会因为前面消息接收者的慢动作而受到阻塞。

其实相互之间有影响的是,从MessageQueue取消息的操作和多个线程向MessageQueue插入消息的操作,这些操作中,任何一个在进行时,其他操作必须等待。等待的时间取决于MessageQueue中有多少个消息,以及在多长时间内把这些消息遍历完

原文地址:http://www.wumii.com/topbar/13H3ht5LP

0 0
原创粉丝点击