转载:http://blog.csdn.net/ldj299/article/details/6399964
Message(消息):
是消息队列中的组成单元。里面包含了数据对象。
获得Message最好的方式是通过obtain()函数获取,有多个obtain()函数,只是传入参数不同,功能是一样的。obtain()作用是从消息池中取出一个Message,节约资源。如果没有则新建一个Message返回。
Runnable :
和Java里的Runnable是有点区别的,Android API对它的解释是:代表一个可以被执行的命令。
Message Queue(消息队列):
这是Android消息机制的基础,里面有很多的消息(Message)。
并且不同的消息有不同的优先级,消息在Android系统中使用MessageQueue的enqueueMessage(Message msg,Long when)来加入消息队列的,所以消息的优先级的区分是根据when来决定的。
Handler(管理者):
负责Message的发送与接收。Handler有两种方式发送消息:
一种是postXXX() ,如:post(Runnable) ,postDelayed(Runnable,long)
在Handler.postXXX(Runnable...) 后,系统调用Handler.getPostMessage(Runnable)将Runnable赋值给Message的callback属性。最后将返回的Message加入消息队列。
源代码如下:
- private final Message getPostMessage(Runnable r) {
- Message m = Message.obtain();
- m.callback = r;
- return m;
- }
另一种是sendXXX(),如:sendMessage(Message),sendMessageDelayed(Message,long),
Handler对消息的发送最终都是调用MessageQueue.enqueueMessage()这个方法将Message放入队列中的。
Looper(循环管理):
管理绑定线程的消息队列和消息处理。一个Looper对应一个MessageQueue,创建Looper的同时会创建MessageQueue。Looper对象不断的向MessageQueue中获取Message,通过Message携带的信息交给相应的Handler处理。Looper就是Handler和MessageQueue之间的桥梁。
Thread(线程):
和Java里的Thread差不多,默认新建的线程是没有绑定Looper对象的,需要用Looper.prepare()初始化线程,并且绑定Looper,Looper.loop()开始循环的处理线程中MessageQueue的消息。
HandlerThread(带Looper对象的线程):
继承自Thread的一个类,它自己里面调用了Looper.prepare() 和 Looper.loop() 这样方法,所以一创建就会有消息队列和Looper对象。
一个线程对应一个MessageQueue(消息队列)一个Looper,但是一个线程可以有多个Handler。