Handler与looper、MessageQueue的关系

来源:互联网 发布:太原市知达常青藤学校 编辑:程序博客网 时间:2024/05/18 02:59

Handler与Looper、MessageQueue的关系
1. Handler机制?
只要遵循Android使用handler来更新UI的机制,我们就不用关心多线程的问题,所有的更新UI的操作都是在主线程的消息队列中去轮询处理的。(如图)
2. Handler封装了消息的发送
(1)handler获取一个message
handler.obtainMessage();
obtainMessage()的源码:
public final Message obtainMessage()
{
return Message.obtain(this); //这里this本身就是handler对象
}
Message.obtain()的源码:
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h; //m.target就是Message的目的地,将handler本身赋给它,就说明目的地就是handler本身
return m;
}
3. Looper
(1)Looper作为一个消息封装的载体,包含了一个消息队列messageQueue,所有的Handler发送的消息都经过这个消息队列——要发送的消息会往这个消息队列中插入或移除。
(2)Looper.loop()方法是一个死循环,不断轮询messageQueue,如果有消息存在取出并发送给handler,然后handler处理消息,没有就阻塞
4. Handler
内部会和Looper进行关联,也就是说在Handler内部可以找到Looper,找到了Looper也就找到了MessageQueue。调用handler.sendMessage()就是向消息队列中发送消息;然后Looper轮询MessageQueue,将message发送给Handler本身进行处理。
5. MessageQueue
一个消息队列,可以添加消息,并处理消息
6. 总结:

当我们将Handler在主线程(UI线程)中创建的时候,Handler对象会关联一个Looper对象,这个Looper对象不是我们创建的,是早就由ActivityThread的main线程(ActivityThread的main线程就是负责创建和更新UI和轮询消息的,和我们开发window应用一样,它有个大循环在里面,在这个大循环中,Looper对象会不断的去调用loop()方法进行消息轮询)创建好了的,而这个Looper对象里面就有就有它的MessageQueue对象(其实就是一个以linked list形式保存Message对象的数据结构)。

handler负责发送消息,Looper负责接收Hnandler发送的消息,并直接把消息回传给hanlder自己,由Handler自己在不同的线程中处理消息。MessageQueue是一个存储消息的容器,Looper内部包含了MessageQueue对象的引用,就是通过这个容器,Looper才能完成对消息的轮询(通过loop()方法)。

Handler和Looper和MessageQueue之间的关系:Handler对象中既有Looper对象的引用也有MessageQueue对象的引用,其中MessageQueue是通过它的Looper对象的一个mQueue属性获取的,而Looper的对象是创建Handler的线程创建的(创建Looper对象需要调用它的静态方法prepare()创建,不能直接new出来),Looper的对象是通过当前创建Handler的线程创建的,并且要保证这个线程要去调用Looper对象的loop()方法进行Message的轮询(在loop()内部会调用一些native的方法完成本地的消息轮询),如果要退出轮询,可以调用Looper对象的quit()方法。UI线程(主线程)已经帮我们做好了这一切,所以,如果我们在主线程中创建Handler,那么就是由主线程自动帮我们去轮询我们的MessageQueue,所以我们在子线程中调用Handler对象的post(),sendMessage(),才能在主线程(UI线程)中处理我们的Message,而且才能在主线程(UI线程)中更新我们的UI。

其实post(),postDelayed(), sendMessage(), sendMessageDelayed() 这四个方法本质都是调用的sendMessageAtTime()这个方法,只是post对runnable对象进行了包装,包装成了Message对象,而这个Message对象的callback就是runnable,最后我们在选择Message处理方法的时候,优先看这个Message对象有没有callback对象,如果有,就调用这个callback对象,然后再看整个handler对象有没有callback对象,如果有,就调用这个callback对象的handleMessage()方法处理Message对象,如果没有则调用handler对象本身的handleMessage方法处理Message,所以Message的处理是有优先级的。这里写图片描述

0 0
原创粉丝点击