android总结系列
一、消息系统构成要素和基本原理
l 消息队列
l 发送消息
l 消息读取
l 消息分发
l 消息循环线程
消息系统必须要依赖一个消息循环线程来轮询自己的消息队列,如果有消息进来,就调用消息处理函数,根据消息类型及其参数来作相应的处理。消息系统要运作起来,必定有消息的产生和消费。暂且把产生消息的线程叫做生产者线程,把消费消息的线程叫做消费者线程。生产者线程将消息发送到消息队列,消费者线程从消息队列中取出消息进行相应处理。当消息队列没有消息时,消费者线程便进入挂起状态,而当有新的消息到达时,消费者线程会被唤醒继续运行。当然生产者同时也可以是消费者。
二、消息模型基本原理
Android消息系统使用了Message、MessageQueue、Looper、Handler等概念,从消息系统的基本原理可以知道这些都是概念包装,本质的东西是消息队列中消息的分发处理方法。Android巧妙地利用了对象抽象技术抽象出了Looper和Handler的概念,并在Looper和handler概念的基础上,通过view的处理框架,十分完美的实现了消息分发的功能。下面就对message、MessageQueue、Looper、Handler进行详细的介绍。
1)Message
Message是消息对象,信息的载体。Message通常放在消息队列中。通常在创建Message实例对象时,使用Message类中的静态方法obtain(),该方法有多个重载版本可供选择。
使用obtain()方法获取Message时并不是直接创建一个新的实例,而是先从Message Pool中查看有没有可用的Message实例,如果有则直接复用;如果没有,则创建一个新的/message实例。调用removeMessage()可以把Message从Message Queue中删除,同时放入消息池中。除了使用obtain方法获取Messaeg之外,还可以通过Handler对象的obtainMessage方法获取。
2)MessageQueue
MessageQueue是一种数据结构,具有先进先出的特点,用来存放消息队列。每个线程最多拥有一个MessageQueue。通常使用Looper对象对线程的MessageQueue进行管理。Android应用程序在创建主线程时,会默认创建一个Looper对象,其他线程并不会自动创建Looper,但在需要的时候,可以调用Looper的prepare()函数创建。
3)Looper
Looper是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而单独存在,Looper对象是通过prepare函数创建的。Looper首先创建一个消息循环框架,然后创建消息队列并把它挂在Linux的线程上下文中,进入取消息并分发消息的循环。每一个Looper对象必须和一个线程关联起来。通过调用Looper的myLooper()可以获得当前线程的Looper对象。对于android。Looper检测MessageQueue是否有Message,有的话就把它广播出去,它对应的Handler接收到,调用handleMessage()方法。
4)Handler
Handler是消息系统的核心,Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。详细实现请参考Looper的源码。
如图:handler
在这个图里handler是UIThread中创建的
这个图是我自己画的,
在这个图里边handleThread是HandlerThread子线程中声明的Handler;handler是UIThread主线程中声明的Handler;从图中可以形象的看出子线程是怎么和主线程发消息的,即在`子线程中得到UIThread中的handler,通过handler的发送消息到主线程,在主线程中利用handleMessage方法执行操作。反过来在主线程给子线程发消息也一样。
再下边几篇文章中,将结合源码,代码实例详细介绍。