您的位置:首页 > 产品设计 > UI/UE

Handler与looper、MessageQueue的关系

2015-08-11 21:12 477 查看
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的处理是有优先级的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: