【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机器人本体线缆故障,如断线、短路、接触不良等。 一、安川工业机器人电缆维修前的准备 在进…

leetcode打卡#day43 携带研究材料(第六期模拟笔试)、416. 分割等和子集

携带研究材料&#xff08;第六期模拟笔试&#xff09; #include<iostream> #include<algorithm> #include<vector>using namespace std;int getMaxValue(vector<int>& weights, vector<int>& values, int n, int m) {vector<vector&…

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

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

vue3delete请求报403forbidden,前后端解决方式

在做开发时&#xff0c;前期已经在Controller类加上CrossOrigin(origins "*")&#xff0c;发送get和post请求都没问题&#xff0c;但遇到delete请求时&#xff0c;又报出跨域问题 一.前端添加proxy代理服务器&#xff08;未能解决&#xff09; 在vue.config.js中使…

热门开源项目推荐~商城系统mall项目详细介绍

Mall 项目是一个开源的电商系统&#xff0c;它包括前台商城系统和后台管理系统&#xff0c;主要基于 SpringBoot 和 MyBatis 进行实现&#xff0c;并采用 Docker 容器化部署1315161819。以下是对 Mall 项目的详细介绍&#xff1a; 项目概览 Mall 项目旨在提供一个高效、可扩展…

【面经总结】Java基础 - Java8 新特性

Java8 新特性 Java8 有什么新特性 Stream API&#xff1a;函数式编程思想&#xff0c;更方便处理集合、文件Optional 类&#xff1a;解决空指针异常Lambda 表达式&#xff1a;替代匿名内部类来实现函数式接口默认方法&#xff1a;接口中可以定义默认实现 Stream API Stream…

【Python入门与进阶】Python如何处理不同进制的数据

Python 提供了多种方法来处理不同进制的数据&#xff0c;包括二进制、八进制、十进制和十六进制。以下是一些常见的操作方式&#xff1a; 1. 进制转换 Python 内置了一些函数&#xff0c;可以方便地在不同进制之间进行转换。 1.1 从不同进制转换为十进制 二进制&#xff1a…

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

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

澳洲前端与后端开发的区别:深入解析两者之间的异同

澳洲前端与后端开发的区别&#xff1a;深入解析两者之间的异同 在澳洲的IT行业中&#xff0c;前端开发和后端开发是两个不可或缺的岗位。虽然它们都致力于构建出色的Web应用&#xff0c;但在职责、技术要求、工作方式和职业发展等方面却存在着显著的差异。本文将从四个方面、五…

Java概述与历史

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

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

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

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

文件操作&#xff08;上&#xff09; 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、使用文件的原因 首先来看…

Codeforces Round 614 (Div. 1) B. Aroma‘s Search

Aroma’s Search time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output With a new body, our idol Aroma White (or should we call her Kaori Minamiya?) begins to uncover her lost past through the OS s…

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

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

LeetCode题练习与总结:验证回文串--125

一、题目描述 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xf…

入职一周感慨

上周太忙了&#xff0c;去打了个球&#xff0c;买了个二手电动车&#xff0c;然后按了个spa。所以忘记吾日三省吾身了&#xff0c;罪孽呀。 本来事情都很顺利的&#xff0c;昨天在工作上&#xff0c;我不小心把cdh集群的主节点ntp remove了&#xff0c;然后重启了所有服务&…

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

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

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

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

JS实现文字溢出隐藏效果

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

为什么选择Symfony框架?深入解析PHP框架

目录 1. Symfony框架概述 1.1 什么是Symfony? 1.2 Symfony的历史 2. Symfony的核心特性 2.1 MVC架构 2.2 可重用的组件 2.3 Bundle系统 2.4 高度可配置性 2.5 强大的调试工具 3. 为什么选择Symfony框架? 3.1 性能与可扩展性 3.2 企业级应用的首选 3.3 活跃的社区…