【hadler机制】

【hadler机制】

https://www.jianshu.com/p/ba46bad5af67

https://www.cnblogs.com/dendai-05/p/6945159.html

https://www.jianshu.com/p/b63cdff5e661

什么是Handler机制?

Handler机制是AndroidSDK提供的一个非常重要的处理异步消息的机制,主要是由Handler、Looper、Message和MessageQueue组成,Handler只是消息处理机制的一部分。

  • Message:消息(分为硬件产生的消息和软件产生的消息)。
  • MessageQueue:消息队列,主要是向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池中的消息(MessageQueue.next)。
  • Handler:主要功能是向消息池发送消息(Handler.sendMessage)和处理消息(Handler.handleMessage)。
  • Looper:不停的循环执行(Looper.loop),从MessageQueue中取出Message并发送给Handler。

分析上述各部分:

[1] Message

什么是硬件消息和软件消息呢?硬件消息就是我们滑动触摸点击按钮等等,软件消息就是我们主动new Message发送出去的。Message实现了Parcelable接口封装消息数据,所以他是存在于内存中的。一个实体(类)如果需要封装到消息中去就必须实现这一接口。

[2] MessageQueue

相当于一个容器,消息池。上述看到了.next应该猜到是链表形式,实际上确实是单链表维护,在插入和删除上有优势。在其next()中会无限循环,不断的判断是否有消息,有就返回这条消息并移除。

[3] Looper

Looper创建的时候会创建一个MessageQueue,它们两个是一一对应的关系。调用Looper.loop()的时候消息循环开始,不断地调用MessageQueue的next()方法,当有消息就处理,否则就堵塞在next()方法中。loop()跟MessageQueue的next()一样都是死循环(源码可见for(;😉)。退出时调用Looper.quit(),它会调用MessageQueue的quit()方法,此时next会返回null,然后loop()方法也跟着退出。

[4] Handler

在主线程构造Handler,new Handler()里调用了Looper.myLooper()这个方法,这个方法是获取当前线程的Looper的。在其他线程调用sendMessage()时主线程的MessageQueue会插入一条Message,然后被Looper使用,在Looper的loop()中通过回调 msg.target.dispatchMessage(msg);发送给Handler。Handler跟Looper的关系是多对一。

https://www.jianshu.com/p/592fb6bb69fa

我们再来总结下Handler消息机制主要的四个类的功能

  1. Message: 信息的携带者,持有了Handler,存在MessageQueue中,一个线程可以有多个
  2. Hanlder: 消息的发起者,发送Message以及消息处理的回调实现,一个线程可以有多个Handler对象
  3. Looper: 消息的遍历者,从MessageQueue中循环取出Message进行处理,一个线程最多只有一个
  4. MessageQueue: 消息队列,存放了Handler发送的消息,供Looper循环取消息,一个线程最多只有一个

一段Looper的源码片段:

img

**解释完各部分的分工那来总结一下他们之间的关系:**Handler负责发送消息(Message)到MessageQueue中,Looper负责循环的接收MessageQueue中的消息通过回调方法返还给Handler自己本身。

img

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值