当前位置: 首页 > 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关键字来调用父类的构造方法。这可以帮助子类初始化从父类继承的属性。调用父类的构造方法要使用以下语…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...