回头看Android之handler,message,messagequeue,looper

handler是什么
handler实质上是Android引入的一种让开发者参与处理线程中消息循环的机制。这句话可以说点出了精髓。来,大家跟我一起来断句读一下。重点在后半句,一种让开发者参与/处理/线程中/消息循环/的机制。实际上这句话点出了这个三个关键字。
1、处理
2、线程
3、消息循环
好了,大家先记着这个,我们接着继续解读handler。来看大佬手绘的一张图。
这里写图片描述

同样的,大家先记着这张图。接下来,我们依次对这几个大类进行梳理和联系。

Thread
线程就是线程(好像是废话=。=),它在整个这一套机制中是最底层的。

MessageQueue
上面说了,Thread在这一套流程中是最底层的,而每个线程内部都维护着一个MessageQueue(消息队列)。消息队列是由消息组成的(好像又是废话=。=)。好,那什么是消息呢?或者说消息是由什么组成的呢?一句话概括,消息是被Android封装过后的事件。不明白?举个栗子,Android发送的广播事件,我们单击某个按钮触发的单击事件都被Android封装成了消息,然后扔进了消息队列中等待处理。而线程会从消息队列里面一个一个的取出消息(也就是事件)进行处理。这里需要特别特别注意的是,这个队列是一个循环队列。

Looper
上面特别强调了消息队列是一个循环队列,那是什么让这个队列循环起来的呢?答案就是Looper。
Looper的作用就是让线程中的消息循环起来的。在默认情况下,我们创建了一个新的线程,而这个新的线程内部是没有 消息队列的。所以,我们为了把消息队列和线程结合起来,就需要一个Looper来绑定他们。

Handler
handler是Android暴露给开发者的一个最顶层的类 。通过这个handler我们可以操作runnable对象和message 。实际上可以把handler理解为thread的代言人,通过handler我们可以在一个线程中去控制另一个线程去做某些事情。需要记住的是:每个Hanlder都关联了一个线程,每个线程内部都维护了一个消息队列MessageQueue,这样Handler实际上也就关联了一个消息队列

怎么用?
关于在Android中如何使用handler,请移步查看大佬的这篇文章。
点击这里查看

在看过上面的文章之后,你应该对handler这种机制有所了解,知道怎么在代码中去操作他。

OK,既然会写这一部分的代码之后,你应该了解handler这种机制实际上是为多线程服务的。现在我们在来看大佬的那张图。
这里写图片描述

Thread在最底层,这个应该很好理解。
MessageQueue上面循环流动的是Message。
Looper是关联消息队列和线程用的。
右侧的handler.sendmessgae( )和handler.post( )是用来发送消息的。我们可以看到消息是被装入到消息队列中的。(关于如何将一个Message放入到MessageQueue中,实质上是调用了MessageQueue的enqueueMessage()方法,这在源码中有所体现。)
而左侧的的handler.dispatchmessage()是用来处理消息的。我们可以看到消息是从消息队列中取出来的。(关于如何将一个Message从MessageQueue中取出来,实质上是调用了MessageQueue的next( )方法。这在源码中有所体现。)

OK,到这里,我相信大家对这一套的机制的理解又加深了不少 。
来总结下
1、Thread是跑在最底层的;
2、每一个Thread对应一个MessageQueue对应一个Handler;
3、Looper是用来关联Thread和MessageQueue的;
4、Handler是跑在最上层供开发者调用的。

其他的关于这套机制在Android源码中的具体实现,请查看大佬的这篇文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值