(面试)Handler消息处理机制原理

Handler是用于实现线程间通信和任务调度的一种机(Handler、 LooperMessageQueue、 Message)。Handler 允许线程间发送MessageRunnable对象进行通信。在Android中UI修改只能通过UI Thread,子线程不能更新UI。如果子线程想更新UI,需要通过 Handler发送消息给主线程,进而达到更新UI的目的。

先创建一个与一个线程相关联Handler实例(Handler与创建它的线程相关联,而且也只与创建它的线程相关联),在Handler的构造函数中获取该线程的Looper对象,然后将Handler与Looper绑定。Handler通过post()、sendMessage()等方法将一个Message对象插入到Looper的MessageQueue中,Looper会不断地从MessageQueue中取出Message并将其传递给Handler的dispatchMessage()方法,dispatchMessage()方法负责处理取出的Message,根据Message的类型执行相应的操作,如回调、更新UI等。
一个线程:只有一个Looper,只有一个MessageQueue,可以有多个Handler。

1.Message  (可携带数据通过whatarg1arg2obj字段)

携带:target=Handler(线程通过target标识发送Message给目标Handler)。

2.Message Queue

存放通过Handler 发送的Message 的消息队列。

sendMessage发送消息时消息的时间when = SystemClock.uptimeMillis() + delayMillis

SystemClock.uptimeMillis()是手机开机相对时间二者加起来肯定不为0

3.Handler

消息处理者,用于发送和接收处理消息。
发送消息 sendMessage()
处理消息 handleMessage()

4.Looper

内部包含一个死循环的MessageQueue,用于存储handler发送的MessageLooper则是不断的从消息队列中取消,如果有消息就取出发送给Handler 处理,没有则阻塞。

1、面试:Handler A发送的 Message 为啥不会跑到 Handler B的 HandleMessage中被处理?

回答:当handler发送消息时(enqueueMessage)会把自身作为Message的一个属性值(msg.target)封装到Message对象汇总一并发送到消息队列中。 Looper轮循出消息会拿到消息的target属性这样就可以知道每条消息是属于哪个hadler对象的。然后让相应对象的handler进行消息处理。

2、面试:handler.post和handler.sendMessage的区别和联系?

回答:1、handler.sendMessage通过Message对象(可携带数据通过whatarg1arg2obj字段),传递复杂数据或区分不同消息类型的场景。

          2、handler.post不需要Message对象,直接传递Runnable。简单任务(如UI更新、延迟操作)

         3、底层联系:handler.post内部会将Runnable包装成一个Message(设置callback字段为该Runnable),然后调用sendMessageDelayed()。当Looper处理该Message时,会优先执行Runnable.run(),而非handleMessage()

3、Looper死循环为什么不会导致ANR?

回答:应用卡死 ANR压根与Looper没有关系,应用在没有消息需要处理的时候,他是在睡眠,释放线程。卡死是ANR,是如果消息队列里有消息,looper却没有及时处理导致的,和Looper是死循环无关。

4、怎么创建Message?

回答:

1.Message message = new message();   会创建一个全新的Message对象,增加内存。
2.Message message = Message.obtain(); 从全局的Message对象池中获取复用实例(避免重复创建)。
3.Message message = handler.obtainMessage();Handler关联的池获取,本质调用Message.obtain(),但自动绑定当前Handler

相关文章:
Handler 使用方法介绍
安卓 Handler面试(1)_android handler机制面试-CSDN博客
【Android面试】Android线程间通信Handler消息机制_android handler机制面试-CSDN博客

AskManyAI

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

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

相关文章

Dify 实战教程 | 5分钟打造文本生成应用( Stable Diffusion 提示词生成器)

AI 绘画离不开「提示词(Prompt)」——如何构造清晰、生动、有表现力的提示词,直接决定你生成图像的质量。而 Stable Diffusion 的提示词构造相比 Midjourney 更加自由,但也更考验组织语言的能力。 今天这篇教程,教你零…

RPC框架源码分析学习(二)

RPC框架源码分析与原理解读 前言 在分布式系统开发中,远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析,我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…

当下流行的智能体通信协议:MCP、A2A、ANP 分别是什么?

在当前人工智能(AI)智能体生态系统中,智能体之间的有效沟通至关重要。为了让AI智能体能够高效、安全地协同工作,业界提出了多种通信协议。其中,MCP、A2A 和 ANP 代表了三个关键层级的通信协议,各自应对不同…

为什么 cout<<“中文你好“ 能正常输出中文

一, 简答: 受python3字符串模型影响得出的下文C字符串模型结论 是错的!C的字符串和python2的字符串模型类似,也就是普通的字符串是ASCII字符串和字节串两种语义,类似重载或多态,有时候解释为整数,有时候是字节串。Uni…

鸿蒙的卓易通,让我踩了一次坑

前言 因为我本身对鸿蒙提不起兴趣,哪怕有些文章给鸿蒙穿上了“黑丝”,再加上公司当前没有适配鸿蒙的计划,所以关于鸿蒙的消息我都关注的很少。 今早,看到了徐宜生老师的一篇文章:“鸿蒙卓易通,是饮鸩止渴…

Cursor vs VS Code vs Zed

代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…

使用 LiteFlow 实现灵活的业务逻辑解耦

1. 引言 1.1 业务逻辑复杂性带来的挑战 在现代软件开发中,随着业务需求不断增长,代码结构日趋复杂。硬编码式的流程控制方式难以适应频繁变更的需求,导致维护成本高、可读性差、扩展性弱。 1.2 规则引擎在解耦中的作用 规则引擎(Rule Engine)通过将业务逻辑与程序代码…

以项目的方式学QT开发(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!

以项目的方式学QT开发 以项目的方式学QT开发 P1 QT介绍 1.1 QT简介 1.2 QT安装 1.2.1 Windows QT安装 1.2.2 QT Creator 使用基本介绍 P2 C基础 2.1 命名空间 2.1.1 命名空间作用 2.1.2 自定义命名空间 2.2 从C语言快速入门 2.2.1 输入输出 2.2.2 基…

【前端】【css】【总复习】三万字详解CSS 知识体系

🌈 CSS 知识体系目录大纲 一、基础知识入门 1. CSS 简介与作用 CSS(Cascading Style Sheets,层叠样式表)是一种用于给 HTML 页面添加样式的语言,作用是让网页更美观、结构更清晰、布局更灵活。 核心作用:…

R利用spaa包计算植物/微生物的生态位宽度和重叠指数

一、生态位宽度 生态位宽度指数包括shannon生态位指数和levins生态位指数。下面是采用levins方法计算生态位宽度。method也可以选择“shannon”。 二、生态位重叠指数 生态位重叠指数,包括levins生态位重叠指数、schoener生态位重叠指数、petrai…

【论信息系统项目的合同管理】

论信息系统项目的合同管理 论文要求写作要点正文前言一、合同的签订管理二、合同履行管理三、合同变更管理四、合同档案管理五、合同违约索赔管理结语 论文要求 项目合同管理通过对项目合同的全生命周期进行管理,来回避和减轻可识别的项目风险。 请以“论信息系统项…

最新网盘资源搜索系统,电视直播,Alist聚合播放

源码描述: 本项目是基于Vue与Nuxt.js技术构建的网盘搜索项目,持续开源并维护更新。该项目旨在使每个人都能拥有属于自己的网盘搜索网站。我们强烈建议用户自行部署该项目。 更新日志: 新增TV播放功能新增Alist源聚合播放功能新增批量删除功…

【Ubuntu】安装BitComet种子下载器

环境 Ubuntu 24.04.2 下载依赖库 环境比较新,此软件需要依赖很多旧的库,逐个安装下载: 1.libicu70 http://nz.archive.ubuntu.com/ubuntu/pool/main/i/icu/libicu70_70.1-2_amd64.deb2.libjavascriptcoregtk-4.0-18 http://security.ubu…

修复“ImportError: DLL load failed while importing lib: 找不到指定的程序”笔记

#工作记录 一、问题描述 在运行CosyVoice_For_Windows项目时,出现以下报错: Traceback (most recent call last): File "D:\ProgramData\anaconda3\envs\CosyVoice\Lib\pydoc.py", line 457, in safeimport module __import__(path) …

ubuntu18 设置静态ip

百度 编辑/etc/netplan/01-netcfg.yaml 系统没有就自己编写 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.20.8/24] # 设置你的IP地址和子网掩码 gateway4: 192.168.20.1 # 网关地址 namese…

帧差法识别

定义: 视频通过闪过x帧画面来实现,帧差法就是利用两帧之间的差异找出。也就是移动目标识别 帧差法识别步骤: 1、灰度处理:将多通道变成双通道压缩图像数据。 cvtColor(before_frame,before_gray,CV_RGB2GRAY);cvtColor(after_f…

基于OAuth2+SpringSecurity+Jwt实现身份认证和权限管理后端服务

1、简介 本文讲述了如何实现简易的后端鉴权服务。所谓“鉴权”,就是“身份鉴定”“权限判断”。涉及的技术有:OAuth2、SpringSecurity、Jwt、过滤器、拦截器。OAuth2用于授权,使用Jwt签发Access Token和Refresh Token,并管理token…

<C++> MFC自动关闭对话框(MessageBoxTimeout)

MFC自动关闭对话框(MessageBoxTimeout) 记录一下今天在界面开发中的解决方案。自动关闭对话框有两种方案: 1.使用定时器实现延迟关闭(DeepSeek方案) 提示框显示几秒后自动关闭,可以使用 SetTimer KillT…

多语言支持的常见设计方案

在 Java 项目中实现**多语言(国际化,i18n)**功能,是很多企业级应用支持不同地区和语言用户的基础需求。以下是 Java 中实现多语言支持的常见设计方案: 一、常见多语言设计方案 1. 使用 ResourceBundle 读取 propertie…

vuex基本介绍

Vuex是Vue.js应用程序中专门用于状态管理的库。以下是其基本介绍: 概念 Vuex采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 特点 - 集中化管理:将应用的状态集中存储在一个单一的状态…