分类: Java
2012-08-20 19:05:47
Android的消息处理有三个核心类,Looper,Handler和Message。其中还有一个Message Queue消息队列,但是MQ被封装到Looper里面。
Looper字面意思是循环者,被设计用来使一个普通线程变成Looper线程。Looper线程就是循环工作的线程,不断从MQ中取出消息,执行消息。
使用Looper类创建Looper线程的方法:
这样一个普通线程就变为了Looper线程
Looper.prepare是将一个Looper对象(内部维护了一个消息队列MQ)放到了当前线程中。调用loop方法之后,Looper线程就会不断从MQ中取出队头的消息执行
Looper的其他方法
·Looper.myLooper()得到当前线程looper对象
·getThread()得到looper对象所属线程
·quit()结束looper循环
Handler
向线程中发送消息可以使用Handler,Handler的默认构造方法将关联当前线程的looper对象,即调用Looper.myLooper()(实现源码中写到),当使用Handler对象发送消息的时候sendMessage,消息会发送到线程中looper对象的MQ中。然后looper从MQ中取出消息,分析消息,进行不同的处理操作
由于Handler可以发送两种类型的消息message和Runnable对象,looper从MQ中取出消息之后会调用方法,识别消息的类型,分别进行不同的处理。
Android的主线程也是一个looper线程,我们在期中创建的handler默认将关联主线程的MQ。一般在activity中创建handler,将其引用传递给其他线程,在其他线程中用handler对象发送消息到activity中,再在activity中进行执行
Handler的默认构造方法将关联当前线程的Looper
在整个消息处理机制中,message又叫task,封装了任务携带的消息和处理该任务的handler。使用时注意:
·尽管Message有public的默认构造方法,但是你应该通过Message.obtain()来从消息池中获得空消息对象,以节省资源
·如果message只携带简单的int信息,优先使用Message.arg1和Message.arg2来传递信息,这比用Bundle更节省内存
·擅用message.what来标识信息,以便不同方式处理message
来自:http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html