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

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

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

相关文章

pcl::IntegralImageNormalEstimation Assertion Assertion `v == T(Value)‘ failed.

pcl::IntegralImageNormalEstimation: Assertion Assertion v T(Value)’ failed. 最新项目用到IntegralImageNormalEstimation类计算法向量。配置运行成功后。 我用 PCL version 1.12.1 on Ubuntu 22. The eigen3 version is 3.4.0 运行IntegralImageNormalEst…

后端:Spring、Spring Boot-配置、定义bean

文章目录 1. 什么是Bean,如何配置2. 如何配置bean2.1 使用注解Bean2.2 使用注解Import 1. 什么是Bean,如何配置 被spring容器所管理的对象被称为bean,管理方式可以有纯xml文件方式、注解方式进行管理(比如注解Component)。 在Spring Boot中&…

开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码

大家好,我是一颗甜苞谷,今天分享一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码。 前言 在当前的物流仓储行业,企业面临着信息化升级的迫切需求,但往往受限于高昂的软件采购和维护成本。现有的…

vue添加省市区

主要参考“element”框架&#xff1a;Element - The worlds most popular Vue UI framework <div class"block"><span class"demonstration">默认 click 触发子菜单</span><el-cascaderv-model"value":options"optio…

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导

Sigrity Power SI Resonance analysis模式如何进行谐振分析操作指导 Sigrity Power SI可以方便快捷的进行谐振分析,谐振分析的目的是为了分析电源地平面组成的腔体的谐振频率以及谐振幅度,让频率在谐振频率附近的信号避开谐振腔,以及添加相应的电容来降低谐振峰值. 仍然以这…

java-web-day7-会话跟踪技术

会话跟踪技术 1.cookie 优点:HTTP协议中支持的技术 缺点: 移动端App无法使用cookie 安全性不强, 而且用户可以自己禁用cookie cookie不能跨域 什么是跨域?协议,IP/域名, 端口三者中有一个不一样就是跨域 2.session--基于cookie实现 优点:用户数据存储在服务端, 只给浏览器一个…

vue特性

Vue.js是一套构建用户界面的渐进式框架&#xff0c;其特性主要包括以下几点&#xff1a; MVVM模式 Vue.js采用了MVVM&#xff08;Model-View-ViewModel&#xff09;的设计模式。在这种模式下&#xff0c;Model代表数据模型&#xff0c;View代表用户界面&#xff0c;ViewModel…

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose&#xff08;1&#xff09;. 安装 Docker&#xff08;2&#xff09;. 安装 Docker Compose&#xff…

Kubernetes实战——DevOps集成SpringBoot项目

目录 一、安装Gitlab 1、安装并配置Gitlab 1.1 、下载安装包 1.2、安装 1.3、修改配置文件 1.4、更新配置并重启 2、配置 2.1、修改密码 2.2、禁用注册功能 2.3、取消头像 2.4、修改中文配置 2.5、配置 webhook 3、卸载 二、安装镜像私服Harbor 1、下载安装包 2、…

从0学习React(7)

在上篇文章中&#xff0c;我们重点讲了关于函数组件的状态管理。这篇文章&#xff0c;我用一种新的方式来讲一讲React&#xff0c;我会通过一个函数来去讲React。当然&#xff0c;这肯定不能一个函数讲完&#xff0c;但是我可以讲很多个函数&#xff0c;一篇文章讲一个&#xf…

安卓屏幕息屏唤醒

背景&#xff0c;今天遇项目需要&#xff0c;需要在下载在后台任务运行时&#xff08;如下载、上传或进行长时间计算&#xff09;&#xff0c;保持 CPU 活动&#xff0c;然后就写了这个实现方法&#xff0c;废话不多说上代码 第一步&#xff0c;再清单AndroidManifest文件声明权…

多项目管理复杂性对企业的影响

在现代企业中&#xff0c;多项目管理已成为提升竞争力的关键策略。然而&#xff0c;资源分配冲突、沟通协调难题、优先级排序复杂等因素使得多项目管理充满挑战。资源分配冲突尤其突出&#xff0c;因为在多个项目同时进行时&#xff0c;有限的资源需要在不同项目间进行合理分配…

利用EasyExcel实现简易Excel导出

目标 通过注解形式完成对一个方法返回值的通用导出功能 工程搭建 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

Mac OS 搭建MySQL开发环境

Mac OS 搭建MySQL开发环境 文章目录 Mac OS 搭建MySQL开发环境一、安装Mysql&#xff1a;二、配置环境变量三、安装Navicat 本地环境&#xff1a; Mac OS Sequoia15.0.1&#xff08;M3 Max) 目标状态&#xff1a; 下载安装Mysql&#xff0c;配置相关环境。 一、安装Mysql&…

关于springboot跨域与拦截器的问题

今天写代码的时候遇到的一个问题&#xff0c;在添加自己设置的token拦截器之后&#xff0c;报错&#xff1a; “ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:112:14) at Axi…

Java 面向对象编程(OOP)(4/30)

目录 Java 面向对象编程&#xff08;OOP&#xff09; 1. 类与对象 1.1 类的定义 1.2 对象的创建与使用 2. 封装 2.1 访问修饰符 2.2 使用 Getter 和 Setter 方法 3. 继承 3.1 继承的基本用法 3.2 方法重写 4. 多态 4.1 编译时多态&#xff08;方法重载&#xff09;…

NVR设备ONVIF接入平台EasyCVR视频分析设备平台视频质量诊断技术与能力

视频诊断技术是一种智能化的视频故障分析与预警系统&#xff0c;NVR设备ONVIF接入平台EasyCVR通过对前端设备传回的码流进行解码以及图像质量评估&#xff0c;对视频图像中存在的质量问题进行智能分析、判断和预警。这项技术在安防监控领域尤为重要&#xff0c;因为它能够确保监…

记录一个跳跃的小游戏

记录一个跳跃的小游戏 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevi…

ansible详细介绍和具体步骤

Ansible简介 1.1 Ansible的基本概念 Ansible是一款开源的自动化工具&#xff0c;旨在简化IT操作的复杂性。它由Michael DeHaan创建&#xff0c;并于2012年发布&#xff0c;随后在2015年被Red Hat收购。Ansible的核心理念是“简单即美”&#xff0c;它通过使用YAML&#xff08…

Python Pycharm下载

pycharm-professional-2023.3.3 python-3.9.0-amd64.exe 链接&#xff1a;https://pan.baidu.com/s/1YYf835hlleeDksPMmX9y2g?pwd9x16 提取码&#xff1a;9x16 更多资料获取学习书籍下面搜一搜这里不迷路&#xff0c;回复关键字获取&#xff1a;python