Android 面试常见客,Handler面试知识点整理!

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()

Q:什么是异步消息?如何发送?

  • 意义:需配合同步屏障使用,否者与同步消息无区别;

  • 异步消息:setAsynchronous(true) → 向 flags 添加 FLAG_ASYNCHRONOUS 标记

发送方式 通过异步 Handler 发送 → 构造 Handler 时,async 传递 true 发送消息前,主动调用 setAsynchronous(true)

安全起见,Android 9.0 普通开发者无法使用异步消息,所有发送方式被标记为 @hide

Q:Handler 的 IdleHandler 机制,如何理解?有什么用途?

接口,需实现 queueIdle() 方法 & 定义在 MQ 中 & 以 MQ mIdleHandlers 维护存储

  • 用途:可在 MQ 即将空闲时,处理任务;

  • 逻辑点:MQ.next() 中,当前无待执行消息时,执行 mIdleHandlers;

依据 queueIdle() 返回值分:持续回调(true) & 一次性回调(false),false 会导致执行完后,从 mIdleHandlers 中移除

Q:IdleHandler 执行耗时会影响正常的消息分发吗?Handler 内部如何处理?

会;IdleHandler 的耗时不可控;执行完后会重置 nextPollTimeoutMillis = 0,重新分发最近消息

Q:移除消息的 removeMessage() 为什么需要两次循环?

优化效率;

  • while-1:移除消息 & 找到下一个待处理的消息,存入 mMessages 中;

  • while-2:从 mMessages 开始,移除后续符合条件的消息;

Q:Handler 的 runWithScissors() 可实现 A 线程阻塞等待 B 线程处理完消息后再继续执行的功能,它为什么被标记为 hide?存在什么问题?原因是什么?

  • 实现:将 Runnable 包装为 BlockingRunnable,其内通过 synchronized + wait 进入等待,待 r 执行完后,调用 notifyAll() 唤醒等待队列的子线程,子线程继续执行;

  • 问题:在子线程 Looper 中使用,可能导致 A 线程进入 wait 等待,而永远得不到被 notify 唤醒;

  • 原因:子线程 Looper 允许退出,若包装的 BlockingRunnable 被执行前,MessageQueue 退出,则该 runnable 永远不会被执行,则会导致 A 线程一直处于 wait 等待,永远不会被 notify 唤醒;

Q:Looper.loop 中,如果没有待处理的消息,为什么不会阻塞 UI?

主线程在 MessageQueue 没有消息时,会阻塞在 loop 的 queue.next() 方法中的 nativePollOnce()方法里。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司21年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值