Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
面试官最最常问的就是:
看过Handler源码吗?请简单说说Android线程间消息传递机制?
本文插图
=
这种情况下 , 首先我们要先理清回答的思路 , 然后用我们的结构化思维去征服面试官!(心虚~)
(一脸谄媚的)我:是这样的 , Android线程间消息传递主要大体可以分为以下几个部分:消息发送、消息循环、消息分发 , 接下来我具体讲讲这三个部分的实现逻辑 。
本文插图
1、消息是怎么发送的?
这个问题还可以进行引申:发送延迟消息的方式是延迟插入呢 , 还是延迟执行?具体回答我也写在流程图上了 , 自己总结吧~
本文插图
【Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制】
2、怎么进行消息循环的?
本文插图
从这里我们也可以知道 , 平时我们通过postDelay发送的消息 , 是不会被精确执行的 。
假设有一条消息执行时间太长 , 处理完它再来处理下一条消息的时候 , 可能已经过了下一条消息规定要执行的时间了 。
3、怎么处理分发消息的?
消息发送这个流程很简单 , 就不画图了 。 祭上代码:
本文插图
用文字描述就是:
1、当msg.callback不为空时 , 回调msg.callback.run()方法
2、当handler的mCallback成员变量不为空时 , 则回调方法 mCallback.handleMessage(msg) , 如果返回true , 直接结束;否则 , 执行步骤3
3、调用Handler自身的handleMessage() , 也就是我们经常复写的方法;
其他问题
1、子线程的Looper和主线程的Looper有什么区别?
答:
子线程的Looper可以退出 , 主线程的Looper不可以退出
子线程的Looper你要自己去prepare , 自己去创建 , 但是主线程的Looper默认帮你创建了
talk is cheap, 上图~
本文插图
本文插图
2、MessageQueue是怎么创建的?
答:MesageQueue是在底层调用native方法去创建的,本质是一个单链表;
3、Handler的消息延迟是怎么实现的?
消息队列按照消息触发时间(msg.when)排序
native通过设置epoll_wait的超时时间 , 使其在特定时间唤醒
延时精度其实不高
4、了解过IdleHandler吗?能说说原理?
关于IdleHandler在下篇文章结合源介绍 , 这里大家就先知道IdleHandler可以实现是当主线程的空闲时执行逻辑的一种方式 。
本文不足
其实线程通信还涉及到很多native层的交互 , 完整的架构应该是这样的:
本文插图
大家有兴趣可以去看gityuan大神的文章 , 五星推荐~~~
当然 , 面试的时候面试官问的问题可不止这一个 , 不论是什么样的大小面试 , 要想不被面试官虐的不要不要的 , 只有刷爆面试题题做好全面的准备 , 当然除了这个还需要在平时把自己的基础打扎实 , 这样不论面试官怎么样一个知识点里往死里凿 , 你也能应付如流啊~
- 霍格沃兹测试学院:内推 | 跳槽吗?可年前面试,年后入职的那种
- 「大咖说生活」你会怎么做?女子淡定回答被录取,面试官:看到男女同事抱在一起
- 「月影说职场」中专生答对被录用,面试官:1+1等于多少?4个大学生应聘失败
- [面试]国培教育—2020江西公务员面试热点:生态菜“种”出致富路
- 观察者@中国网友又看过了,很中国,马来西亚街头的这一幕
- 那些年看过的好电影@三国为何要分道扬镳,荷兰、比利时和卢森堡什么关系,
- 苹果6s换电池哪个牌子好?不懂的你赶快看过来
- 套路贷@网络借款“小白”看过来!法官支招谨防“套路贷”
- 【面试】Google 教你视频面试
- 「人人都是产品经理」腾讯面试题:给视频设计一个评分功能?