最简洁的Handler介绍

最简洁系列介绍:对于理科生来说有条理的知识结构更便于记忆和学习与理解,比起无比详细的文章和成段的代码,知识框架更容易分析问题和定位问题。这系列的文章现在还在尝试阶段,如果您有好的意见,欢迎交流!
一、解决问题
1、理解Handler原理;
2、一个线程里面可以有多少个Looper,多少个消息队列,多少个Handler;
3、消息队列的结构;
4、消息队列没有消息的时候,Loope是什么状态;
5、延时消息的是怎么实现的;
6、当消息队列中没有Message时,线程是什么状态;
二、原理
1、整体逻辑:Handler通常用于线程之间通信,以子线程和主线程通信为例。 主线程默认会初始化一个Looper,Looper会不断的轮询它的消息队列。Handler中会有一个消息队列成员变量,它在那个线程中生成对象,就会将自己的消息队列指向相应线程Looper的消息队列,但他向自己的消息队列发送信时,相当于时向相应线程的消息队列发送消息;
2、消息逻辑


761425-ba7515fe7204af51.png
Handler原理.png

三、问题解决
1、一个线程中只有一个Looper,Looper的修饰是final ,生成Looper的构造方法是私有的,生成Looper通过调用Looper.prepare()方法,这个方法会先判断有无Looper,消息队列是在Looper中产生的,自然也就只有一个。Handler可以有多个,message成员变量target用于指向Handler,所以在发送的时候知道对应关系;
2、消息队列的结构是一个链表结构。Message中有一个next成员变量会指向下一个Message;
3、消息队列没有消息的时候会是阻塞状态,当有消息的时候会去唤醒;
4、当前消息的时间如果还没有到,会不发送,并且设置唤醒一个时间;
5、当消息队列没有消息时,线程会阻塞,没错是阻塞并且还是主线程,不要惊讶,为什么操作屏幕时不会卡顿,是因为屏幕的刷新也是通过Handler发送消息完成的,有消息来会重新唤醒线程。不要被阻塞吓住,如果不阻塞,主线程没事可干就结束了,主线程结束。。。。这你肯定没有遇到过吧!

四、应用
线程的之间的通信很多都适用Handler 例如异步任务,IntentService,HandlerThread,以后有机会会給大家出一系列最简单的介绍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值