当前位置: 首页 > news >正文

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识

在Android开发中,HandlerLooperMessage机制是多线程通信的核心。为了深入理解并优化它们的使用,尤其是在高并发和UI性能优化中,可以利用一些高级特性。

在这里插入图片描述

1. Handler的高阶知识

Handler在基本的消息发送和处理之外,还具有一些高级特性,帮助更好地管理任务和生命周期。

延迟发送和定时任务

Handler允许通过延迟发送消息或定时执行任务,常用于UI动画和定时任务。

  • postDelayed(Runnable r, long delayMillis):延迟执行任务。
  • sendMessageDelayed(Message msg, long delayMillis):延迟发送消息。

使用HandlerThread优化线程管理

创建多个Handler处理不同任务可能会消耗大量系统资源,HandlerThread提供了一个自带Looper的线程,以简化线程创建和Looper管理。

HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());

内存泄漏风险

若未正确管理Handler生命周期,可能导致内存泄漏,尤其是在UI线程中使用匿名内部类创建的Handler时。

  • 解决方案:使用静态内部类结合WeakReference来避免内存泄漏。

消息优先级

通过sendMessageAtFrontOfQueue()将消息放在队列头部,以实现高优先级处理。

2. Looper的高阶知识

Looper负责消息的分发和处理。理解其高级用法有助于优化消息循环性能并提升灵活性。

quit与quitSafely

在非UI线程中运行的Looper通常需手动退出循环。

  • quit():立即终止Looper,未处理的消息将被丢弃。
  • quitSafely():等待当前消息处理完毕后再终止,避免数据丢失。
Looper.myLooper().quitSafely();

主线程Looper与子线程Looper

主线程包含一个默认Looper,而子线程没有。可以通过Looper.prepare()为子线程创建Looper,以实现异步消息处理。

阻塞与空闲回调

  • 阻塞Looper.loop()的消息循环是阻塞的,会持续等待消息。
  • 空闲回调:通过MessageQueue.IdleHandler实现回调(队列为空时触发),用于低优先级任务。
Looper.myQueue().addIdleHandler(() -> {// 在消息队列空闲时执行return false; // 返回false表示回调执行一次后移除
});

3. Message的高阶知识

Message作为轻量消息对象,支持数据传递和控制,并提供一些性能优化方式。

使用Message池提高性能

创建和销毁Message对象会带来开销,通过Message.obtain()重用Message,减少内存分配和回收的开销。

Message msg = Message.obtain();

设置和读取Message的回调

设置Message.callback附加一个Runnable,可以直接执行Runnable而不通过handleMessage方法,适合执行简单任务。

Message msg = Message.obtain(handler, () -> {// 直接在回调中处理任务
});
handler.sendMessage(msg);

自定义Message的存活时间

在高并发场景中,可能需要消息在特定时间内处理完毕,否则即为过期。MessageQueue.removeCallbacksAndMessages(Object token)可清除指定消息。

handler.removeCallbacksAndMessages(null); // 移除所有未处理的消息

4. 关系与注意事项

在高级用法中,Handler、Looper和Message的关系及生命周期管理尤为重要。

  • 生命周期:确保在Looper生命周期内发送消息,避免过期消息或内存泄漏。
  • 优先级处理:通过消息优先级和延迟发送机制实现灵活的任务调度。
  • 线程管理:使用HandlerThread或自定义线程池来优化资源,避免线程阻塞。

总结

Handler、Looper和Message的高阶用法提升了Android多线程开发的灵活性。在实际使用中,需要对内存管理和生命周期有深刻理解,合理运用这些特性,避免常见错误,确保应用高性能和稳定性。

在这里插入图片描述

参考

https://janisharali.com/blog/android-core-looper-handler-and-handlerthread-bd54d69fe91a

相关文章:

Handler、Looper、message进阶知识

Android Handler、Looper、Message的进阶知识 在Android开发中,Handler、Looper和Message机制是多线程通信的核心。为了深入理解并优化它们的使用,尤其是在高并发和UI性能优化中,可以利用一些高级特性。 1. Handler的高阶知识 Handler在基本…...

一文理解决策树:原理、数学公式与全流程实战讲解

一、背景与来源 决策树(Decision Tree)是一种常见的机器学习算法,主要用于分类和回归问题。其概念来源于统计学和决策论,能够直观地模拟人类的决策过程。最早的决策树算法之一是 1963 年由 Hunt 等人提出的,该算法逐渐…...

day04-LogStash扩展

1.LogStash性能不稳定(某天关闭后,再次启动就非常慢),所以后面我们用Filebeat。2.先禁用 # geoip { # source > "clientip" # }3.在生产中要是用nignx服务或tomcat服务我们用EFK架构就可以排查技巧观察点 LogS…...

Linux云计算 |【第五阶段】CLOUD-DAY4

主要内容: Linux容器基础、安装Docker、镜像管理、容器管理、容器部署应用 一、容器介绍 容器(Container) 是一种轻量级的虚拟化技术,用于在操作系统级别隔离应用程序及其依赖项。容器允许开发者在同一台主机上运行多个独立的应…...

为什么QNAP威联通NAS的APP center无法安装APP?

创作立场:原创不易,拒绝搬运~ hello大家好,我是你们的老伙伴,稳重的大王~ 如题,大王带你一起来排查一下,可能遇到的问题。如有帮助,请给个关注鼓励,互谢~ 1 首先,安装…...

Kafka 基础入门

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 前言 1. 核心概念 1.1 Producer 1.2 broker 1.3 consumer 1.4 zookeeper 1.5 controller 1.6 Cluster 2. 逻辑组件 2.1 Topic 2.2 Partition 2.3 Replication 2.4 leader & follower 3. …...

网络问题排查

1.ping 域名发现响应时间很长,怎么分析卡在哪里? 当你在 Linux 系统中 ping 一个域名并发现响应时间很长时,可能存在于多个环节的问题。以下是一些步骤和工具,可以帮助你分析和诊断问题出在哪里: 1. 检查 DNS 解析时…...

webGlL变量的声明与使用

抢先观看&#xff1a; 变量的声明格式&#xff1a;<存储限定符><类型限定符><变量名> 存储限定符&#xff1a;const, attribute, uniform, varying, buffer。 类型限定符&#xff1a;void, bool, int, float, double, vec2, vec3, vec4, mat2, mat3, mat4, s…...

qt的c++环境配置和c++基础【正点原子】嵌入式Qt5 C++开发视频

QT c 环境配置和c基础 c环境配置和工程创建  1.配置步骤  2.新建qt 工程目录和工程  3.重启qt后打开最近的qt项目 c基础-类和对象  1.什么是类和对象    A.类的定义    B.类的结构表示    C.类的访问权限    D.对象的定义    E.类和对象的关系 2.类…...

中间件安全(三)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 本文主要讲解apache命令执行漏洞&#xff08;cve_2021_41773&#xff09;。 靶场链接&#xff1a;Vulfocus 漏洞威胁分析平台 一&#xff0c;漏洞简介。 cve_2021_41773漏洞…...

唱戏机上的内存卡怎么加密?教你两个方法

唱戏机是中老年人群休闲时光的好伴侣。然而&#xff0c;很多唱戏机商家都会面临一个困扰&#xff1a;如何保护唱戏机上内存卡中的音频&#xff0c;避免他人随意复制呢&#xff1f;今天这篇文章看完&#xff0c;问题将迎刃而解~ 数据隐藏 将内存卡插到电脑上&#xff0c;对卡里…...

MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler

MyBatis的SQL执行过程 在前面一系列的文档中&#xff0c;我已经分析了 MyBatis 的基础支持层以及整个的初始化过程&#xff0c;此时 MyBatis 已经处于就绪状态了&#xff0c;等待使用者发号施令了 那么接下来我们来看看它执行SQL的整个过程&#xff0c;该过程比较复杂&#xff…...

webpack解决使用window.open方法打开history路由页面提示404的问题

问题: 一般情况下应该使用history.push(/ssh)打开history路由页面 但项目中使用window.open(/ssh),然后使用new WebSocket进行通信 开发环境下启动项目后,/ssh页面打开却显示cannot get /ssh,控制台提示404 排查问题: 在React开发环境中使用 window.open 打开路由页面时&a…...

怎么把视频的声音转化为文字免费?7个小妙招,视频转文字轻松解决!

您是否也曾在做会议记录时&#xff0c;希望能免费把视频的声音转化为文字呢&#xff1f;在如今我们的办公生活中&#xff0c;用视频记录会议、记录的生活似乎已经成为了我们一项必备技能&#xff0c;但也并非所有人都能轻松获取视频中的信息。尤其是有着听力障碍的人群&#xf…...

【无标题】2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题

2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题已发布~&#xff0c;本届初赛时间为&#xff1a;2024年10月25日18:00至2024年11月1日20:00。本次赛题分为A&#xff0c;B两道&#xff0c;所有参赛队从赛道 A、B 中任选一题作答。在报名系统内选择自己队伍的赛道时&am…...

新能源行业必会基础知识---电力现货问答---第9问---什么是输电权?什么是输电权市场?

新能源行业必会基础知识-----电力现货问答-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/142909208 虽然这本书已经出来有几年了&#xff0c;现货市场已经产生了一定变化&#xff0c;但是原理还是相通的。还是推荐大家买来这本书进行阅读观看&#…...

视频文案素材获取渠道分享

做视频时为文案发愁&#xff1f;别担心&#xff01;今天为大家推荐几个实用的视频文案素材网站&#xff0c;让你灵感爆棚&#xff0c;轻松创作文案。 蛙学网 首先要推荐的是蛙学网。作为专业短视频素材库&#xff0c;不仅有修牛蹄、解压视频等热门素材&#xff0c;还为短视频创…...

尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记

#1024程序员节&#xff5c;征文# public/index.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>redux</title></head><body><div id"root"></div></body> </html&…...

VB中如何创建和使用自定义控件

在Visual Basic&#xff08;VB&#xff09;中&#xff0c;创建和使用自定义控件是一个高级功能&#xff0c;它允许开发者根据特定需求创建具有独特行为和外观的控件。以下是在VB中创建和使用自定义控件的一般步骤&#xff1a; 一、创建自定义控件 打开VB开发环境&#xff1a; …...

Java继承的super关键字

在Java中&#xff0c;super关键字用于调用父类的构造方法、访问父类的成员变量和成员方法。 调用父类的构造方法&#xff1a; 在子类的构造方法中&#xff0c;可以使用super关键字来调用父类的构造方法。这可以帮助子类初始化从父类继承的属性。调用父类的构造方法要使用以下语…...

测试RPA自动化发布-FastAPI实战

# FastAPI 简介这是一篇通过 Playwright 自动发布的测试文章。我们的代码正在测试中......

[4G5G专题] RRU CFR技术:从“削峰”到“塑形”的算法演进与工程实践

1. 从“削峰”到“塑形”&#xff1a;CFR技术的本质蜕变 第一次接触CFR&#xff08;Crest Factor Reduction&#xff09;技术时&#xff0c;我把它简单理解为“信号削峰器”——就像用菜刀切掉蛋糕顶端多余的部分。早期在4G RRU&#xff08;Remote Radio Unit&#xff09;项目中…...

2026 汽车运动权威盘点:历史悠久、级别最高的标杆赛事解读

在汽车产业飞速发展的今天&#xff0c;汽车运动早已超越单纯的竞技比拼&#xff0c;成为彰显工业实力、传递汽车文化、连接产业与消费者的重要桥梁。2026 年&#xff0c;全球汽车运动市场持续升温&#xff0c;国际顶级赛事与国内标杆赛事同频共振、百花齐放。而那些历史悠久、级…...

告别混乱的SVN日志!保姆级教程:用TortoiseSVN图形界面导出清晰可读的变更记录(含过滤与导出选项详解)

高效管理SVN变更记录&#xff1a;TortoiseSVN图形界面全攻略 在团队协作开发中&#xff0c;版本控制系统扮演着至关重要的角色。SVN&#xff08;Subversion&#xff09;作为集中式版本控制的代表&#xff0c;其提交日志记录了项目的完整演进历程。然而&#xff0c;面对杂乱无章…...

基于MCP协议构建本地AI短信分析工具:mac_messages_mcp项目详解

1. 项目概述&#xff1a;一个让AI“读懂”你Mac短信的桥梁如果你正在折腾AI智能体&#xff0c;尤其是那些能帮你处理日常信息的自动化工具&#xff0c;你可能会遇到一个核心痛点&#xff1a;如何让AI安全、便捷地访问你设备上的原生应用数据&#xff1f;比如&#xff0c;Mac上的…...

Unified Access Control:从NAS到RRC的5G接入控制全流程解析

1. 5G统一接入控制&#xff08;UAC&#xff09;的核心逻辑 想象一下你走进一家高级会员制餐厅&#xff0c;服务员会先检查你的会员卡&#xff08;身份验证&#xff09;&#xff0c;再确认你的预约类型&#xff08;业务类别&#xff09;&#xff0c;最后根据当天客流情况&#x…...

Windows系统硬件指纹伪装:EASY-HWID-SPOOFER实战指南

Windows系统硬件指纹伪装&#xff1a;EASY-HWID-SPOOFER实战指南 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 在数字时代&#xff0c;保护个人隐私变得越来越重要。EASY-HWID-S…...

别再手动整理PDF了!用Zotero+坚果云打造你的免费文献同步工作流

Zotero与坚果云联动&#xff1a;构建无缝文献管理生态系统的终极指南 科研工作者和学生群体常面临一个普遍困境&#xff1a;如何在多台设备间高效同步和管理海量文献资料&#xff1f;传统的手动复制粘贴或依赖收费云服务不仅效率低下&#xff0c;还存在版本混乱的风险。本文将深…...

Verilog数据类型详解:从wire/reg到memory的硬件映射与工程实践

1. 从电路到代码&#xff1a;理解Verilog数据类型的本质刚接触Verilog的时候&#xff0c;很多人会把它当成一门编程语言来学&#xff0c;上来就琢磨reg和wire怎么赋值&#xff0c;结果越学越迷糊。我刚开始也踩过这个坑&#xff0c;后来才明白&#xff0c;Verilog的本质是硬件描…...

Maple Mono 字体配置终极指南:从基础安装到高级定制

Maple Mono 字体配置终极指南&#xff1a;从基础安装到高级定制 【免费下载链接】maple-font Maple Mono: Open source monospace font with round corner, ligatures and Nerd-Font icons for IDE and terminal, fine-grained customization options. 带连字和控制台图标的圆角…...