Android消息循环
2014-02-25 16:18
344 查看
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
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
相关文章推荐
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- 解決Linux下Android开发真机调试设备不被识别问题
- [Android]在代码里运行另一个程序的方法
- [软件咨询]WPS2012正式版已发布 金山Office移动版4.0发布
- Android笔记-Linux Kernel Ftrace (Function Trace)解析
- android USB如何修改VID具体实现
- Android增量升级的方法和原理详细介绍
- Android Mouse实现过程详细笔记
- 深入Android Browser配置管理的详解
- Android Mms之:深入理解对话列表管理
- Android APP与媒体存储服务的交互
- android 多线程技术应用
- Android之采用execSQL与rawQuery方法完成数据的添删改查操作详解
- Android数据类型之间相互转换系统介绍
- 通过Android trace文件分析死锁ANR实例过程
- Android实现左右滑动效果的方法详解
- Android 各国语言缩写及简称详细介绍
- Android 自动判断是电话,网址,EMAIL方法之Linkify的使用