前言

最近在后台上看到有很多人私信留言,说在面试或者晋升考核中都遇到了关于Handler、Binder 机制的难题,相信大家已经在为金三银四这个旺季做准备了,现在面试官的问题都是根据你做过的项目进行深入探讨,如若对技术原理和底层逻辑没有深入了解的话,那么你通过面试的机会会显著下降

近期也是收集并整理了关于 Android Framework 的逻辑知识点总结和 Handler、Binder机制的学习笔记,相信能够解决大家对底层逻辑,技术原理,源码解析,面试真题等等相关技术知识点的不够了解透彻的问题

面试真题实例

面试官问:Handler被设计出来的原因?有什么用?

● 一种东西被设计出来肯定就有它存在的意义,而Handler的意义就是切换线程

● 作为Android消息机制的主要成员,它管理着所有与界面有关的消息事件,常见的使用场景有:

● 跨进程之后的界面消息处理

● 比如Activity的启动,就是AMS在进行进程间通信的时候,通过Binder线程 将消息发送给ApplicationThread的消息处理者Handler,然后再将消息分发给主线程中去执行。

● 网络交互后切换到主线程进行UI更新

● 当子线程网络操作之后,需要切换到主线程进行UI更新

● 总之一句话,Hanlder的存在就是为了解决在子线程中无法访问UI的问题

面试官问:Handler线程是如何切换的?

● 假设现在有一个线程A,在A线程中通过Looper.prepare和Looper.loop来开启Looper,并且在A线程中实例化出来一个Handler。Looper.prepare()方法被调用时会为会初始化Looper并为ThreadLocal 设置Looper,此时ThreadLocal中就存储了A线程的Looper。另外MessageQueue也会在Looper中被初始化

● 接着当调用Loop.loop方法时,loop方法会通过myLooper得到A线程中的Looper,进而拿到Looper中的MessageQueue,接着开启死循环等待执行MessageQueue中的方法。 (3)此时,再开启一个线程B,并在B线程中通过Handler发送出一个Message,这个Message最终会通过sendMessageAtTime方法调用到MessageQueue的equeueMessage方法将消息插入到队列

● 由于Looper的loop是一个死循环,当MessageQueue中被插入消息的时候,loop方法就会取出MessageQueue中的消息,并执行callback。而此时,Looper是A线程的Looper,进而调用的Message或者Handler的Callback都是执行在A线成中的。以此达到了线程的切换

面试官问:Handler内存泄漏的原因是什么?

● 通常在使用Handler的时候回通过匿名内部类的方式来实例化Handler,而非静态的匿名内部类默认持有外部类的引用,即匿名内部类Handler持有了外部类。而导致内存泄漏的根本原因是是因为Handler的生命周期与宿主的生命周期不一致

● 比如说在Activity中实例化了一个非静态的匿名内部类Handler,然后通过Handler发送了一个延迟消息,但是在消息还未执行时结束了Activity,此时由于Handler持有Activity,就会导致Activity无法被GC回收,也就是出现了内存泄漏的问题

面试官问:什么是 Binder?

● 直观来说,Binder 是 Android 中的一个类,它继承了 IBinder 接口

● 从 IPC 角度来说,Binder 是 Android 中的一种跨进程通信方式,Binder 还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder,该通信方式在 linux 中没有

● 从 Android Framework 角度来说,Binder 是 ServiceManager 连接各种 Manager(ActivityManager、WindowManager,etc)和相应ManagerService 的桥梁

● 从 Android 应用层来说,Binder 是客户端和服务端进行通信的媒介,当你 bindService 的时候,服务端会返回一个包含了服务端业务调用的 Binder 对象,通过这个 Binder 对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于 AIDL 的服务

面试官问:为什么要使用 Binder?

● 性能:移动设备中如果广泛的使用跨进程通信机制肯定会对通信机制提出严格的要求,而 Binder 相比较传统的进程通信方式更加的高效

● 安全:由于传统进程通信方式没有对通信的双方和身方做出严格的验证,只有上层协议才会去架构,如 socket 连接的 IP 地址可以人为的伪造。而 Binder 身份校验也是 android 权限模式的基础

面试官问:Binder 的工作流程是什么样的?

● 性客户端首先获取服务器端的代理对象,所谓的代理对象实际上就是在客户端建立一个服务端的“引用”,该代理对象具有服务端的功能,使其在客户端访问服务端的方法就像访问本地方法一样

● 性客户端通过调用服务器代理对象的方式向服务器端发送请求

● 性代理对象将用户请求通过 Binder 驱动发送到服务器进程

● 性服务器进程处理用户请求,并通过 Binder 驱动返回处理结果给客户端的服务器代理对象

由于文章篇幅有限,文档的资料内容较多,其他内容仅以图片形式进行展示

结语

随着面试过程中你的回答,面试官就会联想到更多的技术知识点,以此来了解你的技术面有多广,适不适合该档位,或者能不能往更高的职位上发展,全方位地考察你对技术的理解深度,以及解决问题的能力

近段时间对 Android 开发的资料了整合,整理成了文档,因为篇幅有限,有需要更多 Android 开发相关的资料

现在点击:免费获取更多Android进阶资料,学习笔记,面试真题·

Android架构师之路还很漫长,与君共勉

PS:有问题欢迎指正,欢迎大家在评论区留下你的建议和感受

面试官“老生长谈”Handler、Binder 机制 作何解?相关推荐

  1. 面试官都在问 | Linux命令mpstat详解

    面试官都在问 | Linux命令mpstat详解 1. mpstat的基本用法 mpstat的全称为Multiprocessor Statistics,是一款常用的多核CPU性能分析工具,用来实时查询 ...

  2. Redis综述篇:与面试官彻夜长谈Redis缓存、持久化、淘汰机制、哨兵、集群底层原理!...

    点击上方关注 "终端研发部" 设为"星标",和你一起掌握更多数据库知识 于哥你好,最近面试挺多的,尤其是在问到java面试题,Redis被问的特别多,比如Red ...

  3. java 委托_面试官:java双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 类加载器的类别 Bootst ...

  4. 【真实面试经历】我和阿里面试官的一次“邂逅”(附问题详解)

    本文的内容都是根据读者投稿的真实面试经历改编而来,首次尝试这种风格的文章,花了几天晚上才总算写完,希望对你有帮助..已经收录自 Guide 哥开源的 JavaGuide 中.本文主要涵盖下面的内容: ...

  5. 【020期】面试官问:Java 遍历 Map 集合有几种方式?效率如何?

    >>号外:关注"Java精选"公众号,回复"2021面试题",领取免费资料!"Java精选面试题"小程序,3000+ 道面试题在 ...

  6. 面试官:你知道Java中的回调机制吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:22j.co/cFPf          正文    调用和 ...

  7. 阿里面试官:你知道Dubbo的服务暴露机制么?

    点赞再看,养成习惯,微信搜一搜[三太子敖丙]关注这个喜欢写情怀的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系 ...

  8. 面试官:说一说Zookeeper中Leader选举机制

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  9. 跟面试官讲Binder(零)

    面试的时候,面试官问你说,简单说一下Android的Binder机制,你会怎么回答? 我想,我会这么说. 在Android启动的时候,Zygote进程孵化出第一个子进程叫SystemServer,而在 ...

最新文章

  1. 【旧文新读】解释“闭包”需要几行代码?
  2. Response_案例3_输出字节数据
  3. 【白话科普】10s 从零看懂 H5
  4. svn: E180001: Unable to open an ra_local session to URL问题解决方案
  5. 里计算两个数的总和_发动机排量怎样计算?懂这个的修理工真嘀很少!
  6. Brownie Slicing(二分枚举答案)
  7. 微信小程序实现tab切换
  8. android 关联按键和坐标,给大家分享一个,按键精灵安卓版,找多图, 以及找多图返回多个坐标的,相信大家绝对用得到 _ 按键精灵手机版 - 按键精灵论坛...
  9. 关于扫雷的c语言程序设计,C语言程序设计扫雷游戏实验报告
  10. 苹果手机显示服务器返回数据异常,iOS 请求数据 返回-9843 的错误
  11. 照片模糊怎么办?教你简单三步瞬间修复照片清晰度!
  12. python 利用火狐浏览器爬取内容
  13. 用C#开发一个 DNF文字版 【一】
  14. 在济南,少儿国画到底要怎么学?
  15. 打印出ntdll.dll中所有函数名字和地址
  16. String比较字符串方法
  17. CNN数据集——自己建立数据集要点
  18. 环信IM即时通讯集成-遇到问题及创建默认会话+默认欢迎语
  19. (详细)安装nvidia专有驱动并且正确配置,arch linux + lightdm + deepin desktop
  20. 第十周 计算1到20的阶乘的和

热门文章

  1. 【Bugfix系列】通过工具定位corrupted double-linked list: 0xxxxxxxx
  2. 用Python做一个房价预测小工具!
  3. SQL SERVER向后兼容包地址
  4. python提取word所有表格_用Python提取 Word 表格内容
  5. Large-Scale Evolution of Image Classifiers翻译
  6. Rhythmbox音乐播放器常见问题
  7. 第5章基本引用类型(高阶第四版笔记)
  8. 嵌入式操作系统µCOS-II及应用编程
  9. octet mysql_octet(octet是什么意思中文翻译)
  10. Cannot open a library at 'FileMapping