android 消息处理机制
首先还是推荐几篇博客:
http://www.cnblogs.com/-OYK/archive/2011/08/03/2126657.html
http://www.cnblogs.com/coolszy/archive/2011/04/25/2026662.html
再来说说我的理解:
消息处理机制适用场景:
比如:a)监听器类中要控制UI界面类很多组件的属性值,可以传参,可以设置static,但这在有大量组件属性值需要变化时就行不通了,这时可以运用消息处理机制在监听器中通知UI界面类,在界面类中改变属性值,并重新绘制UI.
b)需要在另外的线程中改变界面。
此处注意两个很好用的规则:1)不要在界面线程之外绘制界面。2)不要阻塞界面线程,否则会有不好的用户体验。
再来解析消息机制有关的两个个变量:Looper类,Handler类
Looper类:MessageQueue的管理者
Looper类用来管理特定“线程内”对象之间的消息交换(Message Exchange)。你的应用程序可以产生许多个线程。而一个线程可以有许多个组件,这些组件之间常常需要互相交换讯息。如果有这种需要,您可以替线程构造一个Looper对象,来担任讯息交换的管理工作。Looper对象会建立一个MessageQueue数据结构来存放各对象传来的消息(包括UI事件或System事件等)。
在一个线程中,如果存在Looper对象,则必定存在MessageQueue对象,并且只存在一个Looper对象和一个MessageQueue对象。在Android系统中,除了主线程有默认的Looper对象,其它线程默认是没有Looper对象。如果想让我们新创建的线程拥有Looper对象时,需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用Looper.loop()进入消息循环。
Handler:
消息的处理者.Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建.然后Handler就可以把消息传给该Looper对象所在的线程,同时Handler也可以接受来自Looper的消息。
简而言之:Handler.sendMessage()方法把消息传送到looper线程所在的essageQueue队列,然后自动调用Handler.handMessage()方法响应消息并做对应的处理。