Handler、MessageQueue 、Looper的关系

来源:互联网 发布:九维网络登录 编辑:程序博客网 时间:2024/05/01 04:37

Handler、MessageQueue 、Looper的关系


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

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

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



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

   在主线程创建之后会自动创建一个looper对象,创建looper对象时候会创建一个MessageQueue,

而looper是一个轮询器,会不停轮询messagequeue中的消息,在获取到消息之后就会把这个消息交给对应的handler来处理,

在主线程中创建一个handler对象,这个handler不仅可以获取到消息进行处理,也可以把一个消息放到消息队列中。

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

   根据android系统机制,ui只能在主线程中跟新,如果我们在子线程中更新UI,就会引起ANR异常。

handler可以解决这个问题,在主线程和子线程之间传递信息

      做法就是,先在主线程中创建一个handler对象,looper对象和messageQueue对象Handler、MessageQueue 、Looper的关系是不用创建的Handler、MessageQueue 、Looper的关系,

因为在系统源码中这个是在主线程创建的时候就创建好了。然后在主线程中重写handlerMesage()方法,

这个方法是handler接受到message之后由系统自动调用执行,不需要由程序员主动调用,我们把更新ui的代码放到这个方法中。

然后在子线程中通过handler调用sendMessage(0方法来发送一个消息到消息队列中。发送完这个消息,

获得到这个消息的之后就会执行handlerMessage()方法,因为这个方法是在主线程中实现的,所以就可以更新了。




handler机制; 可以在主线程中给子线程发送消息,也可以在子线程中给主线程发送消息:

    在子线程中给主线程发送消息; 在主线程中创建一个handler对象,

然后重写handlerMessage()方法,在子线程中调用handler.sendEmptyMessage()方法,

然后再handlermessage()方法中就可以执行我们想要执行的操作了,比如说更新Ui

  


     在主线程中给子线程发送消息:在子线程中new一个handler对象,然后重写handlerMessage()方法,在主线程sendEmptyMessage();只是这样是不行的,因为handler要处理消息,但在子线程中是没有Looper对象的,我们要通过Looper.prepare()来创建一个Looper对象,

在这里Looper对象被创建是时候会创建一个MessageQueue,这样就有Looper了,然后再执行完操作(一般是hander.handlerMessage())之后接下来要执行loop额外.loop()方法去轮询这些消息,让handler来处理这些消息。

在安卓源代码中looper.loop()方法是一个永远为true的while循环,所以我们要在子线程中执行的动作,都要在这个方法前去执行,如果在这个方法后去执行的话,就不能被执行到






0 0
原创粉丝点击