Android Handler机制

本文主要介绍了Android的Handler机制,包括其作用,如用于异步线程处理、共享线程消息队列等;还阐述了Handler的使用步骤,以及工作原理,如消息的发送、获取和派发过程,指出消息系统模型的核心是Looper。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Handler机制简介

Handler是一个异步消息处理者,是一个消息分发对象,进行发送消息和处理消息。它里面包含线程队列和消息队列,Handler机制主要分为Handler(异步消息处理者)、Looper(消息泵)、Message(消息封装的载体)、MessageQueue(消息池)。

Looper:在Android的消息机制中扮演着消息循环的角色,具体来说就是它会不停地从MessageQueue中查看是否有新消息,如果有新消息就会立即处理,否则就一直阻塞在哪里;在我们创建Handler对象前需要创建一个Looper对象,在每个线程中,通过ThredLocal来保持每个线程中只保留一个Looper。

Message:消息封装的载体,它可以在内部携带少量的信息,用于再不同线程之间交换数据。除了what字段,还可以用arge1和arg2字段来携带一些整型数据,使用obj字段携带一个Object对象。

MessageQueue:消息池,它的数据结构是一个单向链表,Message就是通过时间的顺序来插入到链表中,Looper再从MessageQueue中获取Message并且发送到Handler中。

Handler机制的作用

1.Hanlder机制主要用于异步线程的处理,可以将一个任务切换到某个指定的线程中去操作。
2.Handler可以让你运行在某个线程上,共享线程的消息队列。
3.接收消息、发送消息、派发消息和处理消息。
4.可以通过Handler制作倒计时。

Handler的使用

1.实例化Handler(这里注意我们如果在子线程中示例化Handler需要先实例化Looper)
2.通过Message.obtain();实例化一个Message对象将需要发送的消息设置进去
3.通过Handler.sendMessage()发送到MessageQueue中
4.在Handler的handleMessage()方法中接收Message对象并对Message进行处理

Handler机制的工作的原理分析

在这里插入图片描述

从上图中我们可以看到我们我们首先是通过Handler来将Message消息发送消息队列中,然后由Looper对象将Message消息取出再返回给我们的Handler对象。

消息队列是由消息队列,由Looper所持有,但是消息的添加是通过Handler进行;

消息循环和消息队列都是属于Thread,而Handler本身并不具有Looper和MessageQueue(大家可以从源码中看到MessageQueue是在Looper中实例化,源码太多,有兴趣的小伙伴可以自己去看一下);
在这里插入图片描述

但是消息系统的建立和交互,是Thread将Looper和MessageQueue交给某个Handler维护建立消息系统模型。所以消息系统模型的核心就是Looper。消息循环和消息队列都是由Looper建立的,而建立Handler的关键就是这个Looper。

线程中就是通过Looper.loop()方法中来实现消息循环从下图中我们可以看到loop()方法中有一个死循环.
在这里插入图片描述

Handler是怎么样将Message发送到MessageQueue中去的

1.我们点击Handler中可以看到在Handler的构造方法中通过Looper.myloop()方法获取到looper对象并通过loop.mQueue来获取到MessageQueue的对象。
Handler获取Looper对象和MessageQueue对象

2.我们获取到Looper对象和MessageQueue之后然后看Message添加到MessageQueue中去

在这里插入图片描述
在这里插入图片描述

从上图中我们可以看到Message通过Message.next()方法按照时间顺序不断添加到消息队列中去。

Looper对象又是怎么样从MessageQueue中获取的Message对象呢

在这里插入图片描述
在这里插入图片描述

Message消息是从MessageQueue的next()方法中不断获取到的消息对象。
消息派发是由Message的target完成,这个target是什么呢?是一个Handler(大家可以在Message的源码中的成员属性中可以看到),消息系统是通过Handler用来与外部交互,把消息派发出去,然后再dispatchMessage中将Message发送到HandlerMessage方法中,最后我们就可以在handlerMessage方法中获取到Message对象并引用。

关注我的博客地址 :后续为大家更新Looper.loop是怎样在线程中保持单一的和Looper.loop()中由一个死循环为什么不会造成主线程阻塞和ANR?

麻烦各位大佬点个赞,如果不好请大家指出来,我也可以修正一下我的知识
请大家关注我的博客

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 和适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager 和 CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值