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

Message,Handler,MessageQueue,Looper之间的关系

2016-06-17 17:22 323 查看

Message,Handler,MessageQueue,Looper之间的关系

Looper:是一个消息分发器,在主线程创建的时候就会创建一个Looper对象;

MessageQueue :消息队列,是由Message组成的一个队列;

Handler :获取到Message,然后执行动作,可以在主线程和子线程中互相传递数据;

先大概说一下他们之间的关系:

在主线程创建之后会创建一个Looper对象,创建Looper对象的时候会去创建一个MessageQueue,而Looper是一个轮询器,会不停的轮询MessageQueue中的消息,在获取到消息之后就会把这个消息交给相应的handler来进行处理,在主线程中创建一个handler对象,这个handler对象把一个Message放到消息队列中,然后获取到消息进行处理。



线程间通信最常见的就是,子线程需要更新UI:

根据安卓系统的机制,UI只能在主线程中更新,如果我们想在子线程中更新UI,就要用到这一套机制了,在主线程和子线程之间传递信息。做法就是,现在主线程中创建一个handler对象,Looper对象和MessageQueue对象是不用创建的,因为在主线程创建的时候就创建好了。然后重写handlerMessage方法,这个方法是在handler接收到message之后执行的方法,我们把更新UI的代码放到这个方法中。然后再子线程中用sendEmptyMessage方法来发送一个消息到消息队里。在发送完这个消息之后,Looper这个轮询器因为一直在轮询消息队列。获得到这个消息之后就会执行handlerMessage方法,因为这个方法是在主线程中实现的。所以UI就可以更新了。

那要是在主线程中给子线程发送消息呢?

在主线程中给子线程发送消息:在子线程中new出来一个handler对象,然后重写handlerMessage方法,在主线程sendemptymessage,但这样是不行的,因为handler要处理消息,但是在子线程中是没有Looper对象的,我们要通过Looper.prepar来创建一个Looper对象, 在这里Looper对像被创建的时候会创建一个MessageQueue,这样就有Looper了,然后再执行完操作之后要执行以下Looper.loop方法,去轮询这些消息,让handler来处理这些消息。在安卓的源代码中,Looper.loop()方法是一个永远为true的while死循环,所以我们要在子线程中执行的动作,都要在这个方法前去执行,如果在这个方法后去执行的话,就不能被执行到了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程通信