【Android面试八股文】1. 你说一说Handler机制吧 2. 你知道Handler的同步屏障吗? 3. Looper一直在循环,会造成阻塞吗?为什么?

news2024/11/16 9:53:18

文章目录

  • 一. 你说一说Handler机制吧
  • 二、你知道Handler的同步屏障吗?
    • 2.1 Handler消息的分类
    • 2.2 什么是同步屏障
    • 2.3 为什么要设计同步屏障
    • 2.4 同步屏障的用法
  • 三、Looper一直在循环,会造成阻塞吗?为什么?
  • 扩展阅读

一. 你说一说Handler机制吧

面试官:
我们来开始吧,第一个问题,请你说一说Handler机制吧。

面试者:
好的,Handler机制是Android中用于线程间通信的工具。它主要由四个部分组成:Handler、Message、MessageQueue和Looper。
在这里插入图片描述

  • Handler:用于发送和处理Message对象。
  • Message:表示要传递的信息,可以包含数据。
  • MessageQueue:消息队列,存储所有发送的Message对象。
  • Looper:用来不断从MessageQueue中取出Message,并交给对应的Handler处理。

在这里插入图片描述

  1. 首先就是Handler调用sendXXX系列或者postXXX系列的方法发送Message,不管是哪种方法都是需要从全局消息池里面拿出一个Message对象,即obtain(虽然Message有个全局消息池,其实它的内部实现只是一个对链头进行插入和删除的单链表,毕竟单链表在插入和删除上比较有优势),

  2. 接着对该Message对象进行各种成员变量的赋值后,把它发送到相应线程的消息队列中,即enqueueMessage(虽然MessageQueue消息队列,但它的内部实现并不是队列,和全局消息池一样,也是一个对链头进行插入和删除的单链表),

  3. 之后的工作交给相应线程的Looper对象,它通过调用loop()方法,无限循环地往消息队列里取消息,即next()

  4. 如果队列里无消息,它便被阻塞了(nativePollOncenativeWake,本地方法使用Linuxepoll模型)。

  5. 如果有消息便把消息取出来,同时消息队列伴随着删除该消息的操作,然后调用Message对象的target成员变量的dispatchMessage方法进行消息分发处理,target实际上就是Handler的实例。

  6. Handler把消息处理完后,Looper便要把这条消息进行回收再利用,即recycle(),对消息进行“净身”,即置空消息的所有成员变量,之后保证消息无污染地插入全局消息池中,避免OOM

二、你知道Handler的同步屏障吗?

面试官:
很好,你对Handler机制解释得很清楚。接下来第二个问题,你知道Handler的同步屏障吗?

面试者:
是的,我知道Handler的同步屏障。

2.1 Handler消息的分类

首先,Handler发送的消息分为三种:

  • 同步消息(普通消息)
  • 屏障消息
  • 异步消息

通常我们使用handler发送消息,都是使用默认的构造函数构造handler,然后使用send方法发送。这样发送的消息都是普通消息也就是同步消息,发出去的消息就会在MessageQueue中排队,

异步消息正常情况下跟同步消息没有区别,只有在设置了同步屏障之后,才会出现差异。

2.2 什么是同步屏障

开启同步屏障的第一步需要发送一个特殊消息作为屏障消息,当消息队列检测到了这种消息后,

就会从这个消息开始,遍历后续的消息只处理其中被标记为“异步”的消息

一旦Looper在处理消息时遇到屏障消息,那么就不再处理普通消息,而仅仅处理异步消息。所以叫“同步屏障”。

相当于给一部分消息开设了"VIP”优先通道。当使用完同步屏障后我们还注意移除屏障。

不再使用屏障后,需要撤销屏障,不然就再也执行不到普通消息了。

在这里插入图片描述

2.3 为什么要设计同步屏障

为什么需要这样?它是设计来为了让某些特殊的消息得以更快被执行的机制。

比如绘制界面,这种消息可能会明显的被用户感知到,稍有不慎就会引起卡顿、掉帧之类的,所以需要及时处理(可能消息队列中有大量的消息,如果像平时一样挨个进行处理,那绘制界面这个消息就得等很久,这是不想看到的)。

在请求监听Vsync信号时,阻塞Handler消息队列中的同步消息,优先保证接收Vsync信号的异步消息,及时生成新的屏幕数据,供屏幕显示。
在这里插入图片描述
我们手机的屏幕刷新频率有不同的类型:60Hz、120Hz 等。

60Hz 表示屏幕在一秒内刷新 60 次,也就是每隔 16.6ms 刷新一次。

屏幕会在我们的手机屏幕刷新频率有不同的类型,60Hz、每次刷新的时候发出一个 VSYNC 信号,通知CPU进行绘制计算。

2.4 同步屏障的用法

屏障消息仅仅是起一个屏障的作用,本身一般不附带其他东西,它需要配合其他Handler组件才能发挥作用。

同步屏障主要用于在某些情况下需要阻止普通消息的处理,而优先处理同步消息。 它通过postSyncBarrierremoveSyncBarrier方法来实现。

当调用postSyncBarrier方法时,会向消息队列中插入一个同步屏障,之后的普通消息会被阻止执行。

只有同步消息(如sendMessageAtFrontOfQueue发送的消息)才能绕过屏障继续执行。

同步屏障通过返回一个Token,可以使用这个Token来移除屏障,恢复普通消息的处理。

例如:

int token = handler.getLooper().getQueue().postSyncBarrier();
// 发送同步消息
handler.sendMessageAtFrontOfQueue(handler.obtainMessage());
// 移除同步屏障
handler.getLooper().getQueue().removeSyncBarrier(token);

这种机制在某些需要严格控制消息顺序的场景下非常有用。

三、Looper一直在循环,会造成阻塞吗?为什么?

面试官:
很好,你对Handler的同步屏障理解得很透彻。最后一个问题,Looper一直在循环,会造成阻塞吗?为什么?

面试者:
Looper本身是一个无限循环,它会不断从MessageQueue中取出消息并处理。如果消息队列为空,Looper会进入阻塞状态,直到有新的消息到来为止。
在这里插入图片描述

虽然这是一种阻塞,但它不会消耗CPU资源,因为它内部使用了epollpoll等高效的系统调用来等待新消息的到来。

MessageQueue.next()方法里,会调用一个native方法:nativePollOnce(long ptr, int timeoutMillis),当主线程没有消息可处理的时候,该方法会阻塞主线程。具体的阻塞和唤醒机制,就是Linuxepoll机制了(Linux 下作为高并发 IO 实现的秘密武器)。
在这里插入图片描述

因此,Looper的这种阻塞是非忙等待的,不会对系统性能造成负担。只要消息队列中有消息,Looper就会立即唤醒并处理消息,因此不会影响应用的响应速度。

在UI线程中,我们通常会有一个Looper不停地循环,这样可以确保UI线程能够及时处理用户输入和其他消息,而不会出现卡顿的情况。

面试官:
你的回答非常全面,对Handler机制以及相关概念理解得很深入。非常感谢你来参加面试,有没有什么问题想问我们的?

面试者:
谢谢您的提问和指导。目前我没有特别的问题。

面试官:
好的,那我们今天的面试就到这里,非常感谢你的时间。祝你好运!

面试者:
谢谢您!

以上就是模拟的面试对话场景,希望对你有帮助。如果还有其他问题,可以随时提出。

扩展阅读

  • 大概说说Handler机制
  • Handler同步屏障
  • android 什么是同步屏障 handler同步屏障场景
  • 终于搞明白了什么是同步屏障
  • 【Android】主线程中的Looper.loop()一直无限循环为什么不会造成ANR?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1818365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL和Oracle的数据类型对比:时间类型 #PG培训

在数据库管理系统中,时间数据类型是非常关键的一部分。时间数据类型的选择和使用直接影响到数据存储、查询效率和应用程序的设计。本文将对比PostgreSQL和Oracle在时间类型方面的实现和特性。 #PG考试#postgresql培训#postgresql考试#postgresql认证 日期和时间类型…

JAVA开发 创建TXT文件,写入并读取数据流输出到控制台

通过BufferedReader类和BufferedWriter类操作txt文件 1、BufferedReader类和BufferedWriter类1.1 BufferedReader类1.1.1 构造方法1.1.2 重要方法1.1.3 作用 1.2 BufferedWriter类1.2.1 构造方法1.2.2 重要方法1.2.3 作用 1.3 总结 2、案例2.1 实现代码2.2 输出 1、BufferedRea…

STM32理论 —— μCOS-Ⅲ(2/2):时间管理、消息队列、信号量、任务内嵌信号量/队列、件标志组

文章目录 9. 时间管理9.1 OSTimeDly()9.2 OSTimeDlyHMSM()9.3 OSTimeDlyResume()9.4 延时函数实验 10. 消息队列10.1 创建消息队列函数OSQCreate()10.2 发送消息到消息队列函数(写入队列)OSQPost()10.3 获取消息队列中的消息函数(读出队列)OSQPend()10.4 消息队列操作实验 11. …

产品经理简要介绍主流电商平台商品API接口的重要应用价值

主流电商平台: 截至目前(2024年6月),主流电商平台通常指的是国内外知名的在线购物平台,包括但不限于以下几家: 1. 中国电商平台: - 淘宝网(taobao.com) - 天猫商…

阿里云香港服务器怎么样?

大家都知道阿里云是国内最受欢迎的云服务商,那么阿里云香港服务器究竟怎么样呢?和硅云的香港服务器用于做外贸网站等业务相比各有哪些优缺点呢? 阿里云和硅云在香港云服务领域有着广泛的应用和良好的口碑。然而,它们各自的特点和…

霍廷格TruPlasma RF 1001 to 1003 (G2/13)手侧通快电源

霍廷格TruPlasma RF 1001 to 1003 (G2/13)手侧通快电源

深入 Go 语言核心:结构体的全方位解析

Go 语言,作为一种高效、静态类型的编程语言,自其问世以来便以其并发处理能力和简洁的语法结构广受开发者欢迎。虽然 Go 不是传统意义上的面向对象语言,它却以独特的方式支持面向对象编程的核心概念,其中结构体扮演了非常关键的角色…

解决Servlet报404未找到

一、检查project struture 打开Project Struture 检查jdk 检查Modules的depencies 如果缺少servlet的jar依赖,则可以先配置tomcat,然后执行如下图的添加依赖(这种方法不适用于maven构建的项目) 把Tomcat里的jar添加进来就可…

Sqlite3入门和c/c++下使用

1. SQLite3基本介绍 1.1 数据库的数据类型 1.2 基本语法 1. 创建数据表格 create table 表名(字段名 数据类型, 字段名 数据类型); create table student(id int, name varchar(256), address text, QQ char(32)); 2. 插入数据 insert into 表名 valu…

音频处理1_基本概念

AI变声和音乐创作的基础 声音本质上是人类可察觉范围内的气压周期性波动, 即声波 声波是一种连续信号,在任意时间内的声音信号有无数个取值。对于只能读取有限长数组计算机来说,我们需要将连续的声音信号转换为一个离散的序列,即数字化表示。…

【一竞技DOTA2】Malr1ne有可能是第二个奇迹哥

1、近日Falcons战队一号位选手skiter在直播中讲到战队组建过程,并称赞了队内中单Malr1ne很强,甚至可能是第二个Miracle-。 “去年我在Tundra的时候曾经与Nemiga的Malr1ne合作过,他替补Nine来打比赛。尽管我们在比赛中没拿到好成绩&#xff0c…

IPv6 ND 协议功能概述

ND 协议功能概述 ND(Neighbor Discovery,邻居发现)协议是 IPv6 的一个关键协议,它综合了 IPv4 中的 ARP,ICMP 路由发现和 ICMP 重定向等协议,并对它们做了改进。 作为 IPv6 的基础性协议,ND 协…

MNIST手写字符分类-卷积

MNIST手写字符分类-卷积 文章目录 MNIST手写字符分类-卷积1 模型构造2 训练3 推理4 导出5 onnx测试6 opencv部署7 总结 在上一篇中,我们介绍了如何在pytorch中使用线性层ReLU非线性层堆叠的网络进行手写字符识别的网络构建、训练、模型保存、导出和推理测试。本篇文…

数字人的技术实现原理

数字人是一种利用计算机图形学、人工智能等技术创建的虚拟人物。数字人可以模拟真人进行各种动作和表情,并与用户进行交互。数字人的技术实现原理主要包括以下几个方面。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. …

如何将 API 管理从 Postman 转移到 Apifox

上一篇推文讲到用 Swagger 管理的 API 怎么迁移到 Apifox,有许多同学反馈说能不能介绍一下 Postman 的迁移以及迁移过程中需要注意的事项。那么今天,它来了! 从 Postman 迁移到 Apifox 的方法有两种: 导出 Postman 集合 &#x…

诺派克ROPEX控制器维修RES-5008 RES-5006

德国希尔科诺派克ROPEX热封控制器维修型号包括:RES-401,RES-402,RES-403,RES-406,RES-407,RES-408,RES-409,RES-420,RES-440,RES-5008,RES-5006&a…

eNSP学习——PPP的认证

目录 主要命令 原理概述 实验目的 实验内容 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建OSPF网络 3、配置PPP的PAP认证 4、配置PPP的CHAP认证 主要命令 //设置本端的PPP协议对对端设备的认证方式为 PAP,认证采用的域名为huawei [R3]int s4/0/0 [R…

ToF原理记录

目录 1. ToF是什么?2. ToF深度测量原理2.1 脉冲调制法2.2 连续波调制法 1. ToF是什么? 飞行时间(Time-of-Flight,ToF)基本原理是通过连续发射光脉冲(一般为不可见光)到目标物体上,然…

BGP学习

BGP是一种矢量协议,使用TCP作为传输协议 ,目的端口号是179.是触发式更新,不是周期性更新 BGP的重点是策略路由的选路,能对路由进行路由汇总。运行BGP的路由器被称为BGP发言者,两个建立BGP会话的路由器互为对等体 IBGP和EBGP的区…

EasyExcel文件导出出现有文件但没有数据的问题

一开始由于JDK版本过高,我用的17,一直excel没有数据,表头也没有,后来摸索了好久,找了资料也没有,后来改了代码后报了一个错误(com.alibaba.excel.exception.ExcelGenerateException: java.lang.…