【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.mzph.cn/web/26221.shtml

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

相关文章

YASKAWA机器人HW1171921-B电缆维修

安川机器人作为现代工业自动化的重要设备,其稳定运行对于生产线的连续性和效率至关重要。然而,随着使用时间的增长,可能会出现各种YASKAWA机器人本体线缆故障,如断线、短路、接触不良等。 一、安川工业机器人电缆维修前的准备 在进…

2024/06/13--代码随想录算法2/17| 62.不同路径、63. 不同路径 II、343. 整数拆分 (可跳过)、96.不同的二叉搜索树 (可跳过)

62.不同路径 力扣链接 动态规划5步曲 确定dp数组(dp table)以及下标的含义: dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。确定递推公式,dp[i][j] d…

u-boot启动第一阶段 Start.S

从sram的uboot的第一阶段跳转到ddr下的uboot的第二阶段地址(不直接从ram中完成uboot是因为ram空间有限) 从start.s中构建异常向量表,然后到lowlevel中,然后完成2到7,之后再再ram中做栈重定位动作,建立mmu&a…

Java概述与历史

引言 Java是一门广泛使用的编程语言,自1995年由Sun Microsystems发布以来,其平台无关性、稳定性和安全性使得它在软件开发领域中占据了重要地位。本文将详细介绍Java的起源与发展、核心理念、Java虚拟机(JVM)、版本演进等内容&…

嵌套查询(一)-谓词IN、量词ANY、量词ALL

一、在多个表之间进行数据查询,除了可以使用连接查询之外,也可以使用嵌套查询,那么什么是嵌套查询呢?如何使用嵌套查询呢? 1、将一个SELECT-FROM查询,嵌套在另一个SELECT查询语句中,那么这个SE…

C语言 | 文件操作(上)【必收藏】

文件操作(上) 1、使用文件的原因2、什么是文件3、二进制文件和文本文件4、 流的打开与关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5、文件的顺序读写5.1 顺序读写函数介绍5.1.1 fputc与fgetc 1、使用文件的原因 首先来看…

人工智能在肿瘤细胞分类中的应用|顶刊速递·24-06-06

小罗碎碎念 推文主题——人工智能在肿瘤细胞分类中的应用。 重点关注 临床方向的同学/老师建议重点关注第四篇&第六篇文章,最近DNA甲基化和蛋白组学与AI的结合,在顶刊中出现的频率很高,建议思考一下能否和自己的课题结合。 工科的同学重…

【永久使用】Xshell7+Xftp7免费版安装教程

Xshell7是用来连接linux服务器的软件。 Xftp7是和linux服务器进行文件操作的软件(可新增,删除服务器上的文件),可嵌入在Xshell7中运行。 如何安装 先下载安装文件(免费获取) https://gitee.com/hadluo/…

网格重构技术在AI绘画中的革新作用

引言: 随着人工智能(AI)技术的飞速发展,艺术创作也迎来了前所未有的变革。AI绘画不仅改变了艺术家的创作方式,还为非专业人士开启了艺术创作的大门。在众多AI技术中,网格重构技术因其独特的作用和效果成为A…

JS实现文字溢出隐藏效果

需求场景 由于项目原因,经常需要使用到canvas来将dom生成为图片供用户保存,但canvas的css属性(例如本文实现的文字溢出隐藏效果)支持并不全面,所有有些功能只能用JS来实现了 实现思路 用JS循环判断填充文本后的元素…

Python NumPy 库详解

大家好,在当今数据驱动的世界中,处理大规模数据、进行复杂数值计算是科学研究、工程设计以及数据分析的关键任务之一。在Python生态系统中,NumPy(Numerical Python)库是一款备受推崇的工具,它为我们提供了高…

PHP调用快递地址解析接口助力项目优化

快递地址智能解析是日常开发中一个重要的工具,可以帮助快递公司提高效率,减少错误,进行数据分析。也可以帮助网购用户快速输入收货地址,提升用户体验。 看完以下操作文档,可以让你在开发中以最快时间完成这个功能&…

mybatis 之 DatabaseIdProvider 教程

mybatis之DatabaseIdProvider 应用中可能同时涉及到多个数据库,比如MySQL,oracle等等,那么当我们使用mybatis的时候,怎么做到动态切换呢?DatabaseIdProvider 可以帮助我们 public interface DatabaseIdProvider {def…

取消el-time-picker组件在Sarari浏览器中下拉回弹效果

在项目中用到el-time-picker组件来选择时间, 但是在Safari浏览器中,滑动分钟列表时,会取消时钟的选择,这是因为滑动分钟列表时有一个回弹效果,回弹把时钟的选择给取消掉了,我们现在要做的就是取消滑动时钟时…

谷歌配置邮箱stmp开发

谷歌的stmp开发,需要一个专用密码 首先要打开二部验证 然后再通过这个链接,创建专用密码 https://myaccount.google.com/u/6/apppasswords?gar1 然后拿专用密码去写在代码上,谷歌发邮件,不知道是不是国内还是什么原因&#xff…

深入理解MySQL分区技术

前言: 在数据量不断增长的当今时代,数据库的性能优化变得尤为重要。MySQL作为一款广泛使用的数据库管理系统,提供了多种性能优化手段,其中分区技术是提升大型表处理效率的有效方法之一。通过将数据分散到多个独立的物理子表中&am…

《大道平渊》· 拾叁 —— 失眠?忍不住乱想?不如反其道而行之!

《平渊》 拾叁 "睡觉的时候就是要胡思乱想" 声明:以下内容针对非失眠症人群,如果失眠不是偶尔发生,而是长期存在,以下内容和你无关,请尽早治疗,遵循医嘱。 失眠的本质是什么?心理因素…

C++并发之锁(std::lock_guard,std::unique_lock)

目录 1 概述2 使用实例3 接口使用3.1 lock_guard3.2 adopt_lock3.3 defer_lock3.4 try_to_lock3.5 try_lock3.6 release3.7 lock3.8 call_one1 概述 锁保护是通过使互斥对象始终处于锁定状态来管理互斥对象的对象。。   在构造时,互斥对象被调用线程锁定,在析构时,互斥被解…

乡村振兴的法治保障:加强农村法治建设,完善乡村治理体系,提高农民法治素养,为美丽乡村建设提供有力保障

目录 一、引言 二、加强农村法治建设的必要性 (一)法治是乡村振兴的基石 (二)法治是乡村治理的保障 (三)法治是农民权益的守护者 三、完善乡村治理体系的路径 (一)加强乡村基…

Talk|CVPR‘24 Oral:超越3D - Point Transformer V3中的多模态特征提取新构想

本期为TechBeat人工智能社区第599期线上Talk。 北京时间6月12日(周三)20:00,香港大学博士生—吴虓杨的Talk已经准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “超越3D - Point Transformer V3中的多模态特征提取新构想”,他通过P…