android处理消息机制----Handler

D触发器(D Flip-Flop)与D锁存器(D Latch) 在解释这个练习题之前,我们先来简单回顾一下D触发器(D flip-flop)和D锁存器(D latch)的概念,以及它们在数字电路中的作用。这将帮助我们理解所提到的练习。 阅读详情

在android开发过程中,我们经常有更新UI的操作。如网络请求后,更新UI控件。此时我们第一想法就是用Handler,确实如此。由于Android开发规范限制,我们不能在非主线程(UI线程,即ActivityThread)里面直接操作UI控件,否则会出现异常,Only the original thread that created a view....(Android线程并不是线程安全的,在多线程中并发操作UI控件可能会发生不可预计的问题)。

现在我并不是想讲Handler 如何操作UI控件,而是为什么Handler可以操作UI控件。来自官方文档一段话

A Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue. Each Handler instance is associated with a single thread and that thread's message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it -- from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue.

说人话就是:Handler可以将一个任务切换到Handler所在的线程中去执行任务。

为啥android需要提供一个在某个线程中执行任务这种功能?这个就解决了在非UI线程中操作UI控件会抛出异常,这就是Handler存在的意义。Handler可以把UI控件更新操作切换到UI主线程中执行,这个就决解了在子线程中如何更新UI主线程控件的问题。总之一句话:Handler可以将Handler中的业务逻辑切换到创建Handler所在的线程中执行。

现在我们知道Handler是将控件操作切换至UI主线程中执行,但是,这个如何切换的呢?具体是怎么切换的呢?

我的理解是这样的:整个流程涉及到Looper、MessageQueue、Handler。

一,Handler通过send方法发送一个消息Message,发送到当前线程的MessageQueue中,

二,Looper 通过loop方法不断地从MessageQueue中抽取Message(在主线程中,默认是包含Looper)

 public static final void loop() {
 72         Looper me = myLooper();//从该线程中取出对应的looper对象
 73         MessageQueue queue = me.mQueue;//取消息队列对象...
 74         while (true) {
 75             Message msg = queue.next(); // might block取消息队列中的一个待处理消息..
 76             //if (!me.mRun) {//是否需要退出?mRun是个volatile变量,跨线程同步的,应该是有地方设置它。
 77             //    break;
 78             //}
 79             if (msg != null) {
 80                 if (msg.target == null) {
 81                     // No target is a magic identifier for the quit message.
 82                     return;
 83                 }
 84                 if (me.mLogging!= null) me.mLogging.println(
 85                         ">>>>> Dispatching to " + msg.target + " "
 86                         + msg.callback + ": " + msg.what
 87                         );
 88                 msg.target.dispatchMessage(msg);
 89                 if (me.mLogging!= null) me.mLogging.println(
 90                         "<<<<< Finished to    " + msg.target + " "
 91                         + msg.callback);
 92                 msg.recycle();
 93             }
 94         }
 95     }
以上可以看到,当有loop检测有message信息的时候, 会调用msg.target.dispatchMessage(msg);这个msg.target是指Handler。

public void dispatchMessage(Message msg) {
    if (msg.callback != null) {
        handleCallback(msg);
    } else {
        if (mCallback != null) {
            if (mCallback.handleMessage(msg)) {
                return;
            }
        }
        handleMessage(msg);
    }
}
handleMessage方法是不是有点熟悉?对,就是Handler的回调方法

这个流程指出了,handler发出消息给messageQueue,looper不断从messageQueue里取出消息,然后执行handlerMessage方法。handlerMessage方法具体的实现在Handler回调里面。

结束了?? “Handler是将控件操作切换至UI主线程中执行”这句话还没解释的通啊。

通过网上资料查询,我知道在ActivityThread创建时,会初始化Looper,也就是说默认情况下Looper在主线程中会创建的。

那我们现在明白,在子线程中可以通过Handler更新UI控件的原因了。Handler可以将Handler中的业务逻辑切换到创建Handler所在的线程中执行。而Looper恰恰是属于主线程的。


下一篇说说Handler、MessageQueue、Looper

计算机组成原理(二)—— 数据的表示与运算 本章目录引言一、数制与编码1.1 进位计数制1.1.1 进制及转换1.1.2 真值、机器数1.2 BCD码1.3 ASCII 码1.4 校验码1.4.1 奇偶校验码1.4.2 海明码1.4.3 CRC循环冗余码二、定点数的表示和运算2.1 定点数的表示2.1.1 无符号2.1.2 有符号(原码、反码、补码、移码)2.2 定点数的运算2.2.1 移位运算2.2.2 加减运算(溢出判断)2.2.3 乘法运算2.2.4 除法运算2.3 强制类型转换2.4 数据的存储和排列三、浮点数的表示和运算3.1 浮点数的表示 阅读详情

相关推荐

基于计算机视觉的Windows自动化工具openclaw-win:从原理到实战

计算机视觉与自动化技术正深刻改变人机交互方式,其核心在于让机器具备“感知-决策-执行”的能力。通过图像采集与处理算法,程序可以识别屏幕上的特定元素;结合模拟输入技术,便能自动执行点击、拖拽等操作,形成完整的自动化闭环。这一技术栈在软件测试、数据采集、重复性办公任务等领域具有重要价值,能够显著提升工作效率。开源项目openclaw-win正是这一理念的工程实践,它整合了图像识别与模拟操作模块,为开发者提供了一个研究自动化技术的具体样本。项目涉及模板匹配、坐标计算等关键技术点,并需处理屏幕适配、操作延迟等实际问

weixin_28745975的博客 328

android通过Handler在线程之间传递消息

这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。 demo:下载地址。 运行截图: 源码: package fk.androiddemo_005; //工作线程不能直接修改主线程的控件,只能通过handler传递信

风之盔的博客 8760

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的

faguoduifangui的博客 4540

Android 消息机制——你真的了解Handler?

前言 Questions Looper 死循环为什么不会导致应用卡死会消耗大量资源吗 主线程的消息循环机制是什么 ActivityThread 的动力是什么 前言 Android的消息机制主要是指Handler的运行机制,对于大家来说Handler已经是轻车熟路了,可是真的掌握了Handler?本文主要通过几个问题围绕着Handler展开讲解。 看该篇文章可能需要掌握一定

凶残的程序员 2万+

汽车TSN时间敏感网络测试技术与探索系列讲座4 -TSN802.1AS同步要求及验证方法

TSN网络各设备类型同步性能要求是什么?各类设备的测试组网及测试内容。也将通过演示来展示相关测试结果,及如何解决上述的测试关注点。

weixin_43903833的博客 761

超详细YOLOv8姿态检测全程概述:环境、训练、验证与预测详解

本篇博客详细介绍了使用YOLOv8-pose进行姿态估计的全过程,包括不同版本模型的性能比较、训练与验证步骤,以及预测代码的实现。它对模型参数、训练过程和输出结果进行了解释,同时提供了详细的配置文件示例和标签数据格式说明。此外,还演示了如何使用预训练模型进行图像预测,并如何处理和理解预测结果。最后,它还讨论了如何评估和比较不同模型的性能。如果有哪里写的不够清晰,小伙伴本可以给评论或者留言,我这边会尽快的优化博文内容,另外如有需要,我这边可支持技术答疑与支持。

CDBmax的博客 3万+

Android Handler消息处理机制

消息处理机制本质:一个线程开启循环模式持续监听并依次处理其他线程给它发的消息。简单的说:一个线程开启一个无限循环模式,不断遍历自己的消息列表,如果有消息就挨个拿出来做处理,如果列表没消息,自己就堵塞(相当于wait,让出cpu资源给其他线程),其他线程如果想让该线程做什么事,就往该线程的消息队列插入消息,该线程会不断从队列里拿出消息做处理。

轻口味的专栏 3402

Modbus协议全家桶(C#纯原生完整版):ModbusRTU + ModbusTCP + ModbusASCII 协议规范+完整封装+工业级实战

你已经掌握了C#串口/网口原生核心API和工业通信协议本质,而今天的主角Modbus协议,是工业通信领域绝对的王者、通用的标准、入门的必修课,没有之一。凡是做工业通信开发,必会Modbus协议;市面上99%的工业设备(PLC、变频器、温控仪、传感器、流量计、扫码枪)都原生支持Modbus协议。Modbus协议不是单一协议,而是一个「协议家族」,我们常说的就是这个家族的三大核心成员,也是工业现场的全部Modbus应用形态。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 562

安卓Handler消息处理机制详解

消息处理机制可以算得上是每个安卓开发入行最先接触的机制之一。它为我们提供了一种线程间通信方式。本文就讲解Handler提供的各种用法以及其运行机理。

lingchen881218的博客 2315

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

将该路径修改到config/semanticktti.yaml文件中的data_path节点下。下载semanticKITTI数据集的点云数据和标签,解压到一起。系统:Ubuntu18。

zhaoguanhua的博客 2596

UNet 改进(39):结合残差连接与CBAM注意力机制的unet模型

本文提出了一种改进的UNet架构,通过融合残差连接和CBAM注意力机制来增强医学图像分割性能。该网络保留UNet的U形结构,但将基础模块替换为ResidualBlock和CBAM的组合:残差块通过快捷连接解决梯度消失问题,CBAM模块结合通道和空间注意力机制突出重要特征。整体架构采用编码器-解码器设计,包含5个下采样和上采样阶段,通过跳跃连接融合多尺度特征。实验表明,这种改进显著提升了原始UNet的性能,特别适用于需要精细边界的医学图像分割任务。

2401_82355416的博客 1016

Android异步消息处理机制之Handler

一 在Android中异步消息处理机制有Handler以及AsyncTask两种方式,而AsyncTask也是Handler的封装,今天就学习一下Handler机制。 二 与Handler消息机制相关的类主要有以下四个: Handler Message MessageQueue Looper 三 Handler主要用于发送消息,以及处理消息。发送消息的方法主要是post和send两种。 post方法有: public final boolean post(Runnable r) {

yangshuangyue的博客 332

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 234

Android之handler消息处理机制详解

介绍android中常见的handler消息处理机制,分析源码

qq_43800449的博客 4189

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

安卓php推送消息机制,Android_Android消息处理机制Looper和Handler详解,Message:消息,其中包含了消息 - phpStudy...

Android消息处理机制Looper和Handler详解Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理。Handler:处理者,负责Message的发送及处理。使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。MessageQu...

weixin_35101659的博客 218

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android 全面解析 Handler 异步消息处理机制

      Android 是不容许在子线程中进行 UI 操作的,但是有些时候我们必须在子线程里去执行一些耗时任务,然后根据执行的结果来更新相应的 UI 控件,对于这种情况,Android 提供了一套异步消息处理机制,完美解决了在子线程中进行 UI 相关操作的问题,今天我们就来一起学习一下这个 Android 系统提供的异步消息处理机制,下面是我们学习的内容大纲                  ...

QDJdeveloper 1348

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Android应用程序消息处理机制(Looper、Handler)分析

Android应用程序是通过消息来驱动的,系统为每一个应用程序维护一个消息队例,应用程序的主线程不断地从这个消息队例中获取消息(Looper),然后对这些消息进行处理(Handler),这样就实现了通过消息来驱动应用程序的执行,本文将详细分析Android应用程序的消息处理机制。        前面我们学习Android应用程序中的Activity启动(Android应用程序启动过程源代码分析和A

老罗的Android之旅 11万+

Android Handler消息循环处理机制

Android 消息处理机制,包括了Message, MessageQueue, Handler, Looper四大块,下面详细介绍下每个模块: Message, 顾名思义消息,要处理的对象; MessageQueue, 消息队列,将消息推送到消息池和从消息池取走消息; Handler, 将消息推送到消息队列中,和处理Looper分发过来的消息; Looper,不断循环执行 将消息从消息队列中取...

dzkdxyx的专栏 798

【Android日记】深入理解Handler消息处理机制

一、Handler的基本用法 我们可以使用一个Handler发送并处理一个线程关联的Message或者Runnable。(注意:Runnable也会被封装到Message.Callback) 基本用法 //自定义Handler创建 static class MHandler extends Handler { @Override public void handleMessage(...

平凡之路 533

Android Handler消息处理机制详解

前言 从我们学习android开始,几乎每天都在和handler打交道.有了它,我们在子线程中处理好了耗时的操作,可以利用它来更新UI.它为我们在线程间的通信提供了很大的方便,而今天博客就来详细的介绍一下Handler的消息循环机制,一步一步的了解其中的奥妙,本文不介绍Handler的详细使用,探究的是内部的原理.所以看这篇博客的童鞋需要有handler的基本使用能力 先抛出一个简单的

小金子的专栏 1万+

Android消息处理机制 handler looper messagequene

Android消息处理机制 2011-10-28 13:36 2396人阅读 评论(5) 收藏 举报 Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制。学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息,理解为线程间通讯的数据单元。例如后台线程在处理数据完毕后需要更新

Z153041121的专栏 1420

安卓事件处理---Handler消息处理机制

1、为什么要有handler机制? 当应用程序启动时,会开启一个主线程(也就是UI线程),由她来管理UI,监听用户点击,来响应用户并分发事件等。所以一般在主线程中不要执行比较耗时的操作,如联网下载数据等,否则出现ANR(应用无响应)错误。所以就将这些操作放在子线程中,但是由于Android子线程是不安全的,所以只能在主线程中更新UI。Handler就是用来 子线程和创建Handler的线程进行通

静下心来吧,让自己变强大点! 2941

Android消息处理机制——Handler

1.为什么要使用Handler? 子线程不能更改主线程的UI,在异步消息处理机制中,通过Handler完成从子线程到主线程的切换,完美解决子线程数据请求,主线程更新UI的问题 2.Handler基本原理 主线程里都维护了一个消息对列(message queue),子线程创建消息(Message),通过主线程里的Handler把消息发送到消息队列(message queue),在主线程里还有一个轮循...

qq_40575302的博客 360

不得不看的Android异步消息处理机制及Handler使用方法用法

Android中的异步消息处理主要由4个部分组成:Message、Handler、MessageQueue和Looper。 1.Message是在线程之间传递的消息

陈先森c的博客 610

Android Handler异步消息处理机制解读

Android Handler异步消息处理机制解读 ​ 前言 去年年底很忙,就没什么时间写博客,后面就是疫情了,疫情在老家把整个人都搞的浑浑噩噩的,提不起兴致。回到公司复工也是比较忙,没啥时间写,周末不陪陪媳妇儿还要不高兴,最近稍微空闲了一点,准备重新开始继续找回状态吧,从基础的安卓异步消息处理机制开始,网上类似博客很多,但是打算自己重新回顾一下加深印象。 开始之前 ​ 说到消息机制,大家一定非常熟悉,因为平时coding的时候高频率的使用。我们都知道,Android系统规定只能在主线程更新UI,子

whbk101的博客 722

android的消息处理机制(Looper,Handler,Message)

一 前言 在正式剖析Handle机制的原理前,我们先来了解一下相关的术语: 通信的同步(Synchronous):只客户端在向服务器发送请求时,必须要等到服务器返回结果,客户端才会继续发送其他的请求。 通信的异步(Asynchronous) : 指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求。 所谓同步调用,就是在一个函数或方法调用时,没有得到结果之前,该调用就不返回,直到返回结果。异步调用和同步是相对的,在一个异步调用发起后,被调用者立即返回给调用者,但是调用者不能立刻得到结果,被

qq_39431405的博客 920
上一篇: 自定义View深入了解(一)
下一篇: NDK入门(一)
深巷落叶
博客等级 码龄16年 1粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值