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

来源:互联网 发布:企业工商数据api 编辑:程序博客网 时间:2024/05/01 07:49

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

messageQueue :消息队列,是由message组成的一个 队列

handler:从messageQueue中获取到message,然后执行动作,可以再主线程和子线程中互相传递数据

看了源码之后大概的说一下他们的关系:

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

举个例子来说明一下:       在子线程中更新UI

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


handler机制:可以再主线程中给子线程发送消息,也可以再子线程中给主线程发送消息:
        子线程中给主线程发送消息:在主线程中创建一个handler对象,然后重写handlmessage()方法,在子线程中调用handler.sendEmptyMessage()方法,然后再handlermessage()       方法中就可以执行我们想要执行的操作了,比如说更新UI


        在主线程中给子线程发送消息:在子线程中new出来一个handler对象,然后重写handlerMessage方法,在主线程sendemptymessage();只是这样是不行了,因为handler要处理消息,但是在子线程中是没有Looper对象的,我们要通过Looper.prepar()来创建一个Looper对象, 在这里Looper对像被创建的时候会创建一个MessageQueue,这样就有Looper了,然后再执行完操作之后要执行以下Looper.loop()方法。去轮询这些消息,让handler来处理这些消息。在安卓的源代码中,Looper.loop()方法是一个永远为true的while循环,所以我们要在子线程中执行的动作,都要在这个方法前去执行,如果在这个方法后去执行的话,就不能被执行到

0 0