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

文章目录

  • 一. 你说一说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.rhkb.cn/news/348449.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现货黄金交易多少克一手?国内外情况大不同

如果大家想参与国际市场上的现货黄金交易,就应该从它交易细则的入手,先彻底认识这个品种,因为它是来自欧美市场的投资方式,所以无论是从合约的计的单位,计价的货币,交易的具体时间,以及买卖过程…

AI大模型在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例:多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

【安装笔记-20240612-Linux-内网穿透服务之cpolar极点云】

安装笔记-系列文章目录 安装笔记-20240612-Linux-内网穿透服务之 cpolar 极点云 文章目录 安装笔记-系列文章目录安装笔记-20240612-Linux-内网穿透服务之 cpolar 极点云 前言一、软件介绍名称:cpolar极点云主页官方介绍 二、安装步骤测试版本:openwrt-…

0601 模拟集成电路中的直流偏置技术

模拟集成电路中的直流偏置技术 6.1.1 BJT 电流源6.1.2 FET电流源6.1.3电流源做作有源负载![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c5381fff64bd48a1b28ba9bee179b18f.png) 6.1.1 BJT 电流源 6.1.2 FET电流源 6.1.3电流源做作有源负载

tmega128单片机控制的智能小车设计

第1章 绪论1.1 选题背景和意义 自第一台工业机器人诞生以来,机器人的民展已经遍及机械、电子、冶金、交通、宇航、国防等领域。近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人工作的机器一…

2.线性神经网络

目录 1.线性回归一个简化模型线性模型:可以看做是单层神经网络衡量预估质量训练数据参数学习显示解总结 2.基础优化方法小批量随机梯度下降总结 3.Softmax回归:其实是一个分类问题回归VS分类从回归到多类分类---均方损失Softmax和交叉熵损失 4.损失函数L…

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

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

借助大语言模型快速学习金仓数据库 KES

基础概念 KES 人大金仓数据库管理系统 KingbaseES(KES) 是由 北京人大金仓信息技术股份有限公司 (以下简称“人大金仓”)自主研发的面向全行业、全客户关键应用的企业级大型通用数据库管理系统。产品融合了人大金仓在数据库领域几十年的产品研发和企业级…

SQL中distinct去重关键字的使用和count统计组合的使用

文章目录 SQL中distinct的使用1、distinct作用于单列2、distinct作用于多列3、 count()、distinct组合使用conut扩展知识 SQL中distinct的使用 1、distinct作用于单列 语法: select distinct 列名 from 表; distinct必须在列的前面,否则直…

Unity HoloLens2 MRTK 空间锚点 基础教程

Unity HoloLens2 MRTK 空间锚点 基础教程 Unity HoloLens2 空间锚点MRTK 空间锚点 准备Unity 工程创建设置切换 UWP 平台UWP 平台设置 下载并安装混合现实功能工具导入混合现实工具包和 OpenXR 包 Unity 编辑器 UWP 设置Unity 2019.4.40 设置Unity 2022.3.0 设置Unity 2022.3.0…

嵌入式仪器模块:音频综测仪和自动化测试软件

• 24 位分辨率 • 192 KHz 采样率 • 支持多种模拟/数字音频信号的输入/输出 应用场景 • 音频信号分析:幅值、频率、占空比、THD、THDN 等指标 • 模拟音频测试:耳机、麦克风、扬声器测试,串扰测试 • 数字音频测试:平板电…

天锐绿盾 | 无感知加密软件、透明加密系统、数据防泄漏软件

摘要:文件加密软件,包含禁止非授权的文件泄密和抄袭复制解决方案即使被复制泄密都是自动加密无法阅读,透明加密,反复制软件,内网监控,文件加密,网络安全方案,透明文件加密,加密文件,图纸加密,知识产权保护,加密数据; 通过绿盾信息安全管理软件,系统在不改…

项目五串行通信系统 任务5-3温度信息上传

任务描述:DS18B20测量温度,单片机采集温度数据转换显示代码,并通过串行口发送到上位机显示。 底层文件: /********************************************* ds18b20底层函数:能完成一次温度数据读取 ***************************…

docker 拉取不到镜像的问题:拉取超时

error pulling image configuration: download failed after attempts6: dial tcp 31.13.94.10:443: i/o timeout 首先设置国内的镜像源&#xff1a;复制下面直接执行 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF{"registry-mirrors"…

NSS题目练习9

[极客大挑战 2020]welcome 界面打开后一片空白&#xff0c;查看题目描述&#xff0c;翻译过来是 1.除了GET请求方法&#xff0c;还有一种常见的请求方法… 2.学习一些关于sha1和array的知识。 3.更仔细地检查phpinfo&#xff0c;你会发现标志在哪里。 补充&#xff1a; sh…

MicroPython 环境下使用 ESP32 连接百度 AI 大模型

前言 在物联网领域&#xff0c;ESP32 由于其丰富的功能和低功耗性能成为了一种流行的选择。结合 MicroPython&#xff0c;它为开发者提供了一个高效的开发环量&#xff0c;让 Python 程序员也能轻松介入到嵌入式系统和 IoT 应用的开发之中。本文将介绍如何利用这些技术&#x…

基于redis的分布式锁

一、redis分布式锁基本信息 1.详细讲解&#xff1a; Redis 分布式锁是一种用于控制分布式系统中多个进程对共享资源的并发访问的机制。通过 Redis 的原子操作和过期时间功能&#xff0c;可以实现一个简单而有效的分布式锁。接下来&#xff0c;我们将详细介绍其工作原理、基本…

引入tinyMCE富文本框在vue3中的使用

实现效果&#xff1a; 官网地址&#xff1a;TinyMCE 7 Documentation | TinyMCE Documentation 1.下载依赖&#xff08;我使用的版本是5.0 目前最新版本到7了&#xff09; pnpm/npm install tinymce5.0.0 -S pnpm/npm install tinymce/tinymce-vue -S 2.在public文件夹下…

模拟电子之电子管

如果要实现一个放大器的功能&#xff0c;需要一个固定的放大倍数&#xff08;Gain&#xff09;&#xff0c;这也就是说输出信号应该是跟随输入信号变化而变化&#xff0c;换句话说输出信号应该要受到输入信号的控制。 在电子学中使用的最多的两个物理量就是电压和电流&#xf…

Java的核心类库

引言 在Java编程中&#xff0c;熟练掌握常用类与对象操作是开发的基础。Java的核心类库提供了丰富的功能&#xff0c;可以帮助开发者高效地处理各种编程任务。本文将详细介绍Java字符串操作、集合框架、日期与时间处理等内容&#xff0c;并通过图表和表格进行总结与示范。 字符…