Android Handler机制核心浅析

Android Handler机制 Android Handler 机制是一种用于在 Android 应用中处理多线程和异步操作的机制。 阅读详情

1.简要概述

Handler负责发送Message到MessageQueue,Looper负责从MessageQueue取消息,最后消费者在Handler.handleMessage(Message msg)函数消费。

一个线程只能有一个Looper和一个MessageQueue(利用了ThreadLocal),一个Looper可以绑定多个Handler,Handler可以发送多个Message。

Handler发消息会把this指针写入message.target,最终messageQueue间接持有handler,此处解释Handler内部类泄漏问题(当handler持有context)。

2.屏障消息

Handler提供了静态方法构造一个异步消息 public static Handler createAsync(@NonNull Looper looper),看MessageQueue中next()中如何处理

                Message prevMsg = null;
                Message msg = mMessages;
                if (msg != null && msg.target == null) {
                    // Stalled by a barrier.  Find the next asynchronous message in the queue.
                    do {
                        prevMsg = msg;
                        msg = msg.next;
                    } while (msg != null && !msg.isAsynchronous());
                    //屏障消息开启后,此处只会取异步消息
                }

可是屏障还没有开启,以上代码并不会执行,如何开启屏障:postSyncBarrier(),结束屏障:removeSyncBarrier(int token),需要配对使用否则同步消息无法执行,会一直在MessageQueue中。屏障消息妙用可以让该Handler发送的消息优先级最高,适合处理一些特殊的消息。

3.Looper一直在执行for死循环,为何不会造成线程卡死?从原理处进行分析,先上Looper.looper简化源码,其中调用了MessageQueue.next()简化代码

public static void loop() {
        final Looper me = myLooper();
        //此处解释在子线程创建的Looper一定要调用Looper.prepare,否则直接报异常
        if (me == null) {
            throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
        }
        final MessageQueue queue = me.mQueue;
        for (;;) {
            //从MessageQueue中取消息
            Message msg = queue.next(); // might block
            //没有消息则退出死循环
            if (msg == null) {
                // No message indicates that the message queue is quitting.
                return;
            }

        }
    }
Message next() {
        // Return here if the message loop has already quit and been disposed.
        // This can happen if the application tries to restart a looper after quit
        // which is not supported.
        final long ptr = mPtr;
        if (ptr == 0) {
            return null;//返回nullLooper退出循环
        }

        int pendingIdleHandlerCount = -1; // -1 only during first iteration
        int nextPollTimeoutMillis = 0;
        for (;;) {
            if (nextPollTimeoutMillis != 0) {
                Binder.flushPendingCommands();
            }

            nativePollOnce(ptr, nextPollTimeoutMillis);
            //此处会调用native方法nativePollOnce是否让该线程阻塞
        }
}

从上面分析,可以得出结论:Looper退出循环或阻塞后,为何后面发消息后依然可以处理,那还要看MessageQueue.enqueueMessage(Message msg, long when)中调用nativeWake(mPtr),此方法此处会唤醒线程同时调用静态方法Looper.loop()。通俗讲当该线程阻塞后会释放cpu资源,不会造成卡死,当有消息后线程被唤醒,继续执行消息(此处对native方法不做详细分析)。

安卓中的消息循环机制Handler及Looper详解 我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handler机制来完成该功能,即当子线程中耗时操作完成后,在子线程中通过Handler向主线程发送消息,在主线程中的Handler的handleMessage方法中处理接受到的消息。这就是安卓中的消息机制,安 阅读详情

相关推荐

Android Handler 消息机制

每一个搞 Android 的对 Handler 应该都不陌生,网上大神的文章也是数不尽的。这篇文章是个人在学习 Handler 过程中的一些疑问的记录。 1. 什么是 Handler,有什么作用 Handler 首先是一个 java 类,定义在/frameworks/base/core/java/android/os/Handler.java。但一般提到 Handler 并不专指它自身,常用来代指 Android 中的消息处理机制,或者说线程间通信的工具,典型应用就是在子线程中更新 UI 线程。那么,很显然

hejnhong的博客 3403

Handler消息机制

handler的简单解析

weixin_44389338的博客 438

Android Handler消息机制详解

Android应用程序是通过消息驱动实现的,因此,Handler机制对于Android应用程序的运行极其重要。 本文详细的介绍了Handler、Looper、MessageQueue、Message、ThreadLocal,内容较长,可以分部分进行学习。文章未详尽之处,欢迎交流,描述有误之处,欢迎指正。 点关注,不迷路;点收藏,你更强;点点赞,我心欢。

u011532067的博客 1192

Android之学习Handler原理的理解与常见问题

有一段时间查资料看这个了,下面就简单记录一下我自己的理解 一、Handler工作流程 通常,我们使用Handler的时候会先new一个Handler,然后调用send或者post来处理,类似这种: 那么handler发送消息之后实际是怎么工作呢? 之前听了一节享学课堂关于Handler原理介绍的课程,里面老师给了这么一张图,我一直以来觉得这张图很好理解。 先看右上角,handler发送消息后,消息队列就像有传送带一样一个一个接收并处理这些发来的消息,而让这传送带动起来的东西就是Looper。Looper

qq_46269365的博客 1884

逆向实战:手把手教你用Frida绕过Flutter App的SSL Pinning(附脚本修改指南)

本文详细介绍了如何利用Frida工具绕过Flutter应用的SSL Pinning保护机制,包括静态分析定位关键函数、定制Frida Hook脚本以及流量捕获的完整解决方案。通过实战案例和脚本修改指南,帮助安全研究人员有效应对Flutter应用的安全挑战,特别适用于安卓平台的逆向工程和抓包需求。

weixin_28723171的博客 404

SAP增强实施-第四代显式和隐式增强技术介绍

概念介绍 SAP第四代增强- Enhancement-Point,分为2种显式增强和隐式增强,显式增强就是手动加入到程序中的Enhancement options,隐式增强就是系统内置的Enhancement options。 第四代增强其实是第三代上的加强,都属于面向对象语言的接口技术的应用,但第四代增强使SAP增强实施更具灵活性,四代增强可以直接在源代码里面写增强了代码了,输入参数也不像 二代...

weixin_40672823的博客 7959

Handler消息传递机制——源码赏析

Android的消息处理有四个核心类:Handler 、Looper 、Message 、MessageQueue , 都在android.os包中 一、线程的魔法师 Looper

u014084504的专栏 916

11. TI MSPM0G3507 DMA传输实战:ADC数据自动搬运与电压采集

本文以TI MSPM0G3507为例,详细讲解了如何利用DMA(直接存储器访问)实现ADC数据的自动搬运与电压采集。通过实战演示,解放CPU资源,提升系统实时性与效率,适用于电赛备赛及嵌入式开发中的数据采集场景。

weixin_42465140的博客 135

安卓的Handler机制

Android Handler机制解析 Handler机制是Android实现线程间通信的核心框架,主要由四个关键组件构成: Handler:消息发送和处理的桥梁,负责发送消息(sendMessage)和处理消息(handleMessage) Message:消息数据结构,包含what、obj、arg1/arg2等字段 MessageQueue:消息队列,负责消息的存储和管理 Looper:消息循环,从队列中取出消息并分发 每个线程只能拥有一个Looper,通过ThreadLocal保证线程隔离。使用Han

weixin_44078411的博客 1170

微信小程序后台定位与实时位置更新的实战指南

本文提供了微信小程序实现后台定位与实时位置更新的完整实战指南。针对小程序退到后台后位置更新中断的痛点,详细解析了基于`startLocationUpdateBackground`API的后台定位解决方案。内容涵盖从隐私协议配置、项目权限声明,到授权、启动、监听、停止的核心代码流程,并分享了真机调试、性能优化及权限引导等关键避坑经验,帮助开发者构建稳定可靠的后台位置服务。

weixin_29008055的博客 473

别再傻傻分不清!5分钟搞懂倾斜摄影里‘地面分辨率’和‘模型精度’到底啥关系

本文深入解析倾斜摄影中‘地面分辨率’与‘模型精度’的关系,帮助读者快速理解两者的本质区别与内在关联。通过实战案例和公式计算,详细说明如何从航飞设计到精度验证全流程控制,避免常见认知误区,并针对不同应用场景提供精度需求建议。

weixin_33700350的博客 478

Android Handler 机制原理详解

Android Handler机制是线程间通信的核心,基于消息队列(MessageQueue)和循环器(Looper)构建,实现跨线程任务调度。主要组件包括: Handler:负责发送/处理消息,需绑定Looper; MessageQueue:按时间排序存储消息; Looper:驱动消息循环,每个线程唯一; Message:消息载体,含执行时间和目标Handler。 工作流程:子线程需手动调用Looper.prepare()初始化,通过Handler发送消息到队列,Looper.loop()循环取出消息并分

csdn_silent的博客 8922

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2475

【Android】Handler消息机制

Android消息机制学习分享

m0_74448051的博客 1651

SCADA|测试KingSCADA4.0信创版采集汇川PLC AC810数据

摘要:雷工分享KingSCADA4.0信创版采集汇川PLC数据的配置过程。由于项目繁忙,笔记更新延迟。信创产业要求采用国产化产品,此次通过ModbusTCP协议连接AC810 PLC。主要步骤包括:新建IOServer应用(需厂家协助从3.8升级至4.0)、安装ModbusTCP驱动、配置设备地址(192.168.1.88:5021)、运行IOServer并通过网页监控变量。尽管信创版操作体验较差,但出于国产化战略需要仍需使用。雷工表示理解产品初期不足,相信未来会逐步优化。2025年4月11日记录于四川绵阳

做有价值的事,积累有价值的笔记! 865

Linux存储软件栈剖析之第5篇:F2FS文件系统

F2FS是三星专为NAND闪存设计的开源文件系统,通过异地更新、磨损均衡等机制优化闪存特性。其架构采用层次化存储管理(Block→Segment→Section→Zone)和多日志区域设计,基于数据热度分类(热/温/冷数据)提升性能。核心创新包括节点地址表(NAT)解决级联更新问题,以及基于成本的垃圾回收算法。F2FS通过检查点机制确保崩溃一致性,并利用并行访问能力充分发挥闪存性能优势,显著降低写放大效应,延长设备寿命。

指尖动听知识库 199

Android :安卓学习笔记之 Handler机制 的简单理解和使用

Android Handler机制的简单理解和使用1、Handler使用引出2、背景和定义3、作用4、相关概念5、工作流程5.1、对应关系6、基本使用7、参考 1、Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎闪屏页面),如下图: 可能觉得直接开启一个包含倒序循环的子线程就ok了,具体实现如下: activity_main <?xml version="

JMW1407的博客 6776

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android源码学习-Handler机制及其六个核心点

安卓Handler源码全面讲解

分享+记录 6万+

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android handler机制浅析

在安卓中,Handler负责消息的传递,它提供了一套在线程间传递消息的机制。Handler与looper、message、messageQueue一起,共同构成了安卓的消息发送框架。初学安卓的朋友可能对安卓的线程模型感到疑惑,也会感到有很多限制,UI线程既不能等待,又不能做耗时操作,非UI线程又不能改变UI,但这些问题却可以通过handler轻松解决。那么handler内部是怎么实现的呢?它的实现原

泥土的博客 436

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

浅析Android Handler消息机制的实现原理

0. 背景描述 Android系统出于对简单、高效的考虑,在设计UI体系时采用了单线程模型,即不会在多个线程中对同一个UI界面执行操作。简单是指单线程模型可以不用考虑和处理在多线程环境下操作UI带来的线程安全问题,高效是指单线程模型下无需通过额外的手段处理多线程安全问题(一般通过加锁等方式解决线程安全问题,而使用锁进行同步就会存在性能开销)。同时,因为Android应用属于UI交互型应用,需要对用户的操作进行快速响应,因此在处理UI操作的线程中不能执行网络请求、本地IO等这一类耗时操作,否则会导致用户的操作

boker_han的博客 1329

Handler机制浅析

前言Android应用程序是基础Java语言,内部封装了消息队列,然后在主线程开启了死循环不断获取消息并处理来实现不间断的界面变化与各种操作的执行。这个过程主要由:Looper、Handler、Message三者来共同完成,Message作为消息载体,Looper用于封装消息队列,Handler用于插入与处理消息。Looper简析首先,看看Looper类的几个成员变量// sThreadLocal.

李锦锋 395

【Android 消息机制】Handler

Android专题学习-Handler总结

studyForMokey的博客 985

Handler消息机制-Handler

Handler 消息处理机制主要由 Handler、Looper、MessageQueue 和 Message 四部分组成。Handler作用:用于发送消息和处理消息。发送消息到 MessageQueue。处理从 Looper 分发的消息。特点:每个 Handler 绑定到一个 Looper,从而绑定到一个线程。可以发送 Message 或 Runnable。Message作用:消息的载体,封装了需要处理的任务或数据。通过 what 字段标识消息类型。通过 obj 字段传递数据。

只想搞钱 1719

Android Handler机制浅析

本文是在读《Android开发艺术探索》这本书中关于“Android的消息机制”时所作记录,以便加深对Android的消息机制的理解。一、概述Android的消息机制主要是指Handler的运行机制,Handler的运行需要底层的MessageQueue 和 Looper的支撑。MessageQueue以队列的形式对外提供插入和删除的工作,虽然叫Queue,但实际上它是采用单链表的数据结构来存储消...

Superior's Blog 269

Android中handler机制

核心目的:解决多线程并发和线程切换的问题。在 Android 中,主线程(UI 线程)负责处理用户交互和UI更新,绝对不允许在主线程中进行耗时操作(如网络请求、数据库读写),否则会引发 ANR。同时,Android 的 UI 工具包不是线程安全的,不允许在子线程中直接更新 UI。在子线程中执行耗时任务,然后将结果发送回主线程进行UI更新。Handler 就是这个机制的基石。Handler 机制的四大组件:Message: 需要传递的消息,可以携带数据和标识。: 一个按时间排序的优先级队列。

qq_45906596的博客 1043

Handler消息传递机制浅析

Android 的 Handler 消息机制是线程间通信的核心组件,主要用于主线程与子线程之间的通信。它基于消息队列(MessageQueue)和事件循环(Looper)实现,通过 sendMessage() 发送消息并在 handleMessage() 中处理。典型应用场景包括异步更新 UI、定时任务等。使用时需注意内存泄漏问题,在 Activity 销毁时应移除未处理消息。示例展示了子线程执行任务后通过 Handler 更新 UI 的完整流程,涉及 DrawerLayout 等组件的配合使用。高版本 A

likuoelie的博客 1122
上一篇: Android单元测试之排序算法(冒泡 选择 插入 合并 快速 堆 Shell)
Luiing
博客等级 码龄17年 9粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值