【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?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据在商业中的应用——Kompas.ai如何助力企业决策

引言 在现代商业中,大数据逐渐成为企业决策的重要工具。通过对海量数据的分析和处理,企业可以获得重要的市场信息和决策支持。本文将探讨大数据在商业中的应用,并介绍Kompas.ai如何通过AI技术助力企业决策。 大数据的发展及其重要性 大数据…

项目文章 | Cell ReportsChIP-seq和RNA-seq联合鉴定伯克霍尔德氏菌毒性的重要调节因子

发表单位:中山大学深圳校区制药科学学院 发表日期:2024年5月14日 研究期刊:Cell Reports(IF: 8.8) 研究材料:伯克霍尔德氏菌 主要技术:ChIP-seq,EMSA,微尺度热泳分析…

1970-2021年各区县碳排放总量,可选择所需年份获取,shp/excel多种格式数据

基本信息. 数据名称: 1970-2021年各区县碳排放总量 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据来源:网络公开数据

Java面经总结

一、java基础 1.重载和重写的区别 重载: 发生在同一类中,函数名必须一样,参数类型、参数个数、参数顺序、返回值、修饰符可以不一样。重写: 发生在父子类中,函数名、参数、返回值必须一样,访问修饰符必须…

清晖项目管理资深企业咨询顾问闫清受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 清晖项目管理资深企业咨询顾问闫清女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾,演讲议题为“PMO的多重人工智能价值”。大会将于6月29-30日在北京举办,敬请关注! 议题简要: 在近几年的AI概…

据阿谱尔统计显示,2023年全球凹版印刷机市场销售额约为9.1亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球凹版印刷机市场销售额约为9.1亿美元,预计在2024-2030年预测期内将以超过2.54%的CAGR(年复合增长率)增长。 由于对软包装和印刷包装的需求不断增长,全球凹…

前端问题整理

Vue vue mvvm(Model-View-ViewModel)架构模式原理 Model 是数据层,即 vue 实例中的数据View 是视图层, 即 domViewModel,即连接Model和Vue的中间层,Vue实例就是ViewModelViewModel 负责将 Model 的变化反映…

SpringCloud学习笔记 - 1、Boot和Cloud版本选型

文章目录 前言需要(学习/用到)的技术SpringBoot版本的选择我们为什么要使用 Java 17,以及SpringBoot 3.2 呢? SpringCloud 版本的选择SpringCloud 命名规则Springcloud Alibaba 版本的选择如何确定Boot,Cloud&#xff…

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

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

大语言模型LLM-三种模型架构

Transformer transfomer可以并行地计算? transformer中encoder模块是完全并行的,而decoder不是完全并行的。 模型结构 使用原文表达如下:the encoder maps an input sequence of symbol representations \((x_1, x_2, \cdots, x_n)\) to …

ICRA 2024:基于视觉触觉传感器的物体表⾯分类的Sim2Real双层适应⽅法

⼈们通常通过视觉来感知物体表⾯的性质,但有时需要通过触觉信息来补充或替代视觉信息。在机器⼈感知物体属性⽅⾯,基于视觉的触觉传感器是⽬前的最新技术,因为它们可以产⽣与表⾯接触的⾼分辨率 RGB 触觉图像。然⽽,这些图像需要⼤…

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

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

六西格玛培训,让企业焕然一新,迎接新挑战!

在当今快速变革的商业环境中,企业要保持竞争力,就必须不断进化、优化和创新。而六西格玛培训,正是这一进化过程中的核心驱动力。 六西格玛培训不仅仅是一系列的技术和工具,更是一种深入骨髓的质量文化和持续改进的哲学。通过专业…

微服务架构 | nacos - [自动刷新配置方式 失效排查]

INDEX 1 配置方式1.1 springboot 配置1.2 springcloud 配置 2 失效排查2.1 常见失效场景2.1.1 配置不配套2.1.2 自动刷新未开启2.1.3 依赖冲突2.1.4 改错了配置文件 2.2 未知情况关键排查点 1 配置方式 nacos 的配置中心主要有两套配置方式,配置方式不互相共通&…

Qt绘图项目 - 简易表盘

发话少说&#xff0c;放码过来 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();prot…

lammps聚合物断键拉伸模拟

本文介绍聚合物的断键拉伸。 在lammps模拟中&#xff0c;所有的键默认是永久存在的&#xff0c;非正常情况下&#xff0c;不能断开&#xff0c;否则会产生"bond atoms missing”错误。 聚合物的拉伸模拟过程中&#xff0c;聚合物链并没有被拉断&#xff0c;而只是把不同的…

探索Vue.js中的文件夹上传解决方案:vue-simple-uploader

在现代Web应用开发中&#xff0c;文件上传是一个常见需求。然而&#xff0c;随着应用复杂性的增加&#xff0c;传统的文件上传方式可能无法满足所有需求&#xff0c;特别是当涉及到文件夹上传和大文件处理时。本文将介绍一个基于Vue.js的解决方案——vue-simple-uploader&#…

小程序使用接口wx.getLocation配置

开通时需详细描述业务&#xff0c;否则可能审核不通过 可能需要绑定腾讯位置服务&#xff0c;新建应该&#xff0c;绑定到小程序 配置 权限声明&#xff1a;在使用wx.getLocation前&#xff0c;需要在app.json的permission字段中声明对用户位置信息的使用权限&#xff0c;并提…

Unity基础(一)unity的下载与安装

目录 一:下载与安装 1.官网下载地址 2.推荐直接下载UnityHub 3.选择编辑器版本(推荐长期支持版) 4.在UnityHub安装选择相应的模块 二:创建项目 简介: Unity 是一款广泛应用的跨平台游戏开发引擎。 它具有以下显著特点&#xff1a; 强大的跨平台能力&#xff1a;能将开发的游…

Linux系统安装ODBC驱动,统信服务器E版安装psqlodbc方法

应用场景 硬件/整机信息&#xff1a;AMD平台 OS版本信息&#xff1a;服务器e版 软件信息&#xff1a;psqlodbc 12.02版本 功能介绍 部分用户在使用etl工具连接数据库时&#xff0c;需要使用到odbc驱动&#xff0c;下面介绍下服务器e版系统中编译安装此工具的相关过程。 E…