Handler 基础篇

Handler 基础篇

看看与你了解的Handler是不是不同,欢迎来挑刺


这个系列以分享总结为主,希望能精简的讲清楚Android相关的机制,

有什么问题或者意见,欢迎评论和私信联系我


相关文章

感谢下面文章的大佬给出启发灵感和技术分享,欢迎交叉阅读不同博客的看法,这样才能找到合适的自己的理解方式

Carson_Ho 图文解析 Handler通信机制 的工作原理


内容预览

心急的同学 可以点击右侧菜单跳转

一、Handler是什么?
二、为什么Android要设计Handler
三、Handler 工作流程
四、总结思考

一、Handler是什么?

  • Android中一套很重要的消息传递机制。

    为什么重要?
    因为,除了我们自己的消息以外,Android系统本身许多通讯也是通过Handler,比方说画面的绘制、界面点击事件、activity跳转等等全部都要靠handler机制维护,所以说,这是一套非常重要的消息传递机制。

    ( ̄へ ̄ ) 思考一下,共用一套消息机制,消息多了,会不会有什么问题?
    

二、为什么Android要设计Handler?

  • 在之后某一个时间点,运行一段程序或者发送一条消息1
  • 线程间通讯

    平时的使用中,相信都有感受到Handler.postDelay()用的是有多么的爽,这就是handler给我们带来的便利性;
    线程间通讯,这部分留到下回分解,饭要一口一口吃~

三、Handler 工作流程

1. 设计思路

例子
整体设计思路可以理解为像是邮件投递这样一个机制,发件人发出去消息,投放到信箱邮递员负责通过邮件上的消息,找到收件人,然后发出去。

如果还是不太理解,看看第二个例子,传送带模型,意思差不多,我就不细讲了。
在这里插入图片描述

2. 关键成员

上述例子中,引出几个Handler机制的关键成员

  • 发件人/收件人 = Handler
  • 信息 = Message
  • 信箱 = MessageQueue
  • 邮递员 = Looper

① Handler

负责消息发送与接收

② MessageQueue

消息队列,主要用于消息的存取。

③ Looper

循环器,消息处理的中枢,不断从消息队列(MessageQueue)中取出消息,分派给对应的Handler,直到quit才停止。

④ Message

消息类,整个Handler消息机制中,传递的就是Message。


3. 具体流程


3.1 图解

先 上 图
在这里插入图片描述

  • 说明:

先看红色部分

  1. 发送消息
    post和sendMessage最终使用 HandlersendMessageAtTime 发送 Message
  2. 放入队列
    调用 MessageQueueenqueueMessage ,放入队列中
  3. 唤醒
    enqueueMessage 内部的 nativeWake 方法,可以理解为,唤醒 next 方法中的 nativePollOnce ,next函数就会往下走

再看绿绿绿色部分

  1. 获取
    线程中Looperloop一直不停调用 MessageQueue.next 获取下一条 Message
  2. 阻塞待唤醒
    如果没有消息,就 nativePollOnce 阻塞
  3. 信息返回
    唤醒了,next函数接着走拿到下一条 Message ,返回给 loop
  4. 回调给Handler处理
    loop拿到 Message ,找到 Message 对应的 Handler ,回调给 dispaatchMessage ,让 Handler 自己处理

3.2 方法调用链

如果不理解可以换个角度,看看方法调用链

发送过程:

Handler.sendMessgae()/post() 				--- 发送消息前,对消息的一些封装,如post方法封装到callback
	|__Handler.sendMessageAtTime()			--- 最终其实都是调用同一个方法
		|__MessageQueue.enqueueMessage()	--- 消息加入队列

取出过程:

Looper.loop()							---线程循环获取信息分发
	|__MessageQueue.next()				--- 获取下一条,没消息就阻塞
		|__Handler.dispatchMessage()	--- 分发回去

总结与思考

Handler无非就是一套消息通讯机制,原理还是很好懂的。
但是懂了工作原理之后,好奇的我们并不满足,会有很多疑问对吧?比方说:

 Handler 为什么能线程切换?根本的原理是什么?
 Looper 存在什么地方?有一个还是多个?
 共用一套消息机制,消息多了,会不会有什么问题?
 阻塞不会卡住整个线程吗?
 ......

别急,下一篇会细细分析。

当然如果关于Handler您有什么疑问或者吐槽,直接评论就可以了,随便写点什么,让我知道我写的怎么样吧,感谢!


  1. 参考google官方开发文档 Handler ↩︎

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值