当前位置: 首页 > 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

http://www.lryc.cn/news/472781.html

相关文章:

  • 一文理解决策树:原理、数学公式与全流程实战讲解
  • day04-LogStash扩展
  • Linux云计算 |【第五阶段】CLOUD-DAY4
  • 为什么QNAP威联通NAS的APP center无法安装APP?
  • Kafka 基础入门
  • 网络问题排查
  • webGlL变量的声明与使用
  • qt的c++环境配置和c++基础【正点原子】嵌入式Qt5 C++开发视频
  • 中间件安全(三)
  • 唱戏机上的内存卡怎么加密?教你两个方法
  • MyBatis 源码分析 - SQL执行过程(三)之 ResultSetHandler
  • webpack解决使用window.open方法打开history路由页面提示404的问题
  • 怎么把视频的声音转化为文字免费?7个小妙招,视频转文字轻松解决!
  • 【无标题】2024年第五届 MathorCup 数学应用挑战赛——大数据竞赛赛题
  • 新能源行业必会基础知识---电力现货问答---第9问---什么是输电权?什么是输电权市场?
  • 视频文案素材获取渠道分享
  • 尚硅谷-react教程-求和案例-数据共享(下篇)-完成数据共享-笔记
  • VB中如何创建和使用自定义控件
  • Java继承的super关键字
  • 3D点云与2D图像的相互转换:2D图像对应像素的坐标 转为3D空间的对应坐标
  • 查找算法简记
  • 算法竞赛(Python)-状态间的奇妙转移(动态规划)
  • String.format() 用法详解
  • es 常用命令(已亲测)
  • RabbitMQ 高级特性——事务
  • HCIP-HarmonyOS Application Developer V1.0 笔记(二)
  • 初体验鸿蒙 HarmonyOS NEXT开发
  • MySQL---主从复制和读写分离
  • Apache Kyuubi概述——网易数帆(网易杭州研究院)开源
  • 前端代码注释