Handler 是 Android 中最高频使用的消息机制,这些年在大厂的面试过程中,碰到的越来越多了。虽然碰到的多但是能完成解答出来的朋友却很少,怎么回事呢?
其实原因不言而喻,大厂对Handler的面试题都有一定的深度。而且喜欢扣细节;
例如我之前文章讲到,Handler 的 runWithScissors() 可以实现 A 线程向 B 线程发送一个消息,使 A 线程进入阻塞,等待 B 线程处理完消息后再继续执行。那么延伸出来的 2 个问题就是;
-
runWithScissors() 的原理是什么?
-
它被标记为 @hide 不允许使用是因为存在什么问题吗?
再比如,我们知道 MessageQueue,实则是一个基于触发时间 when 的优先级消息队列。那么在什么场景下,MessageQueue 中靠后的消息,会先于靠前的消息,被调度执行呢?
这些问题,若是不看源码,只停留在使用层面,基本上很难捋清楚。
Q:Handler 机制中,存在哪些角色?各自承担了什么功能?
-
Handler:消息辅助类 & 对外的接口 & 向 MQ 投递消息 & 消息的目标处理者;
-
Message:消息的载体 & 被 Handler 投递 & 自带 Handler 处理 & 自带消息池;
-
Looper:循环器 & 持有 MQ & 循环从 MQ 中获取消息 & TLS 线程唯一;
-
MessageQueue:基于时间的优先级队列 & 链表结构 & Java 与 C++ 层的纽带;
Q:Handler 分发事件优先级,是否可拦截?拦截的优先级如何?
Handler 中,通过 dispatchMessage() 处理消息,其中存在优先级策略;
-
优先级1:msg,callback,run() - 独占;
-
优先级2:mCallback.handleMessage(msg) - 返回值决定是否拦截该消息;
-
优先级3:handle.handleMessage();
Q:主线程 Looper 何时运行?
App 启动时,会调用到 ActivityThread 中,Looper 就在其 main() 方法中被启动;main() 中会主动调用 Looper.prepareMainLooper() 和 Looper.loop();Tips:ActivityThread 不继承自 Thread,它只是一个运行在主线程上的对象;
Q:Handler 的 Message 可以分为那 3 类?分别有什么标识?
-
同步 Message:普通 Message;
-
异步 Message:msg.setAsynchronous(true)
-
同步屏障:msg.target == null
Q:同一个 Message 对象能否重复 send?
关键在于如何定义同一个 Message。
- 角度一:Java 对象层面,可被复用;
原因:Message 由消息池维护,即同一个对象被回收后会被再次复用;| new Message & Message.obtain()
- 角度二:业务层面,不能复用;
原因:Message 通过 enqueueMessage() 入队时,会通过 markInUse() 标记,再次入队无法通过 isInUse() 检查,则抛出异常;
我这里总结了BAT大厂关于Handler 的超过 100+ 高频面试题,现已经整理成了高清的PDF学习文档,需要的朋友可以直接去我 GitHub地址:https://github.com/733gh/Android-T3 中查阅;基本涵盖了各个角度,大家可以拿来自测一下。在面试前也可以刷一刷,毕竟 Handler 面试题虽高频出现,但是遇到还是不用慌张的。
Q:场景:MessageQueue 是基于触发时间 when 的优先级队列,那么什么情况下,队列中靠后的消息会优先得到执行?原理是什么?
-
场景:靠前的消息是同步消息,靠后的消息是异步消息,且消息队列的队头为同步屏障;
-
原理:同步屏障会阻塞 MQ 中的同步消息,优先处理异步消息;
Q:Message 的同步屏障有什么用?有什么意义?如何发送一个同步屏障?
-
用途:阻塞 MQ 对同步 Message 的分发,优先处理异步消息,没有异步消息时则进入休眠,直到同步屏障被移除;
-
意义:允许异步消息优先于同步消息执行;
-
同步屏障:特殊的 Message,target == null,无法通过 Handler 入队出队,需直接操作 MQ;入队:postSyncBarrier():返回一个屏障 token;出队:removeSyncBarrier()
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。
人生不可能一帆风顺,有高峰自然有低谷,要相信,那些打不倒我们的,终将使我们更强大,要做自己的摆渡人。
我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。
我们更强大,要做自己的摆渡人。**
我把自己这段时间整理的Android最重要最热门的学习方向资料放在了我的GitHub,里面还有不同方向的自学编程路线、面试题集合/面经、及系列技术文章等。
资源持续更新中,欢迎大家一起学习和探讨。