Android线程间的消息传递机制

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析) 本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。 阅读详情

android的线程间的通信可以理解成三个部分:消息的发送、消息的循环、消息的分发处理

消息是怎么发送的?

核心是理解sendMessage()里面做了哪些操作

  1. handler.sendMessage()
  2. handler.sendMessageDelayed()
  3. handler.sendMessageAtTime()
需要注意的是,sendMessageAtTime不是指要在这个时间插入这条消息,而是在这个时间将该消息分发出去
  1. handler.enqueueMessage()
  2. messageQueue.enqueueMessage()
  3. native->nativeWake()
  4. native->messageQueue.wake()
  5. native->mLooper.wake()

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

mWakeEventFd是一个计数器。

有两个线程,线程A和线程B
在这里插入图片描述
线程A有两种状态,运行、阻塞。监听eventfd事件的的navtive函数是阻塞的,当线程B往线程A消息队列发送消息,与此同时线程B通过eventfd写一个计数,此时会唤醒messageQueue中next函数内的无限for循环里面的,从messageQueue单链表中读取表头的操作

消息循环的过程是怎么样的?

消息循环是调用Looper.loop()

在这里插入图片描述
获取当前线程的looper,获取当前looper的messageQueue,开启无限循环,从messageQueue中读消息,如果msg为null,则阻塞,不为null,则将msg分发,其中target就是handler。以上有两个重点:

  • queue.next()是如何获取消息的?
  • msg.target.dispatchMessage(msg)是怎么分发消息的?

是如何处理消息分发的?

核心是理解dispatchMessage()里面做了什么操作
在这里插入图片描述

  1. 优先判断msg自身是否有callback,如果有,回调出去,即执行
msg.callback.run();

msg的callback是什么时候设置的呢?
是在handler.post(runnable)时候,执行sendMessageDelayed时,将Runnable对象赋值进message对象的callback中去
2. 判断handler是否有全局的callback,如果有,则掉全局的handleMessage函数。需要注意的是,如果回调的全局callback中的handleMessage函数,return 的是true,则不会再回调handler自身的handlerMessage函数,如果return的值是false,则会继续掉通handler自身的handlerMessage函数。一些hook技术就是通过设置全局的callback,并且handleMessage的返回值为false,中间修改msg的参数,这样,自身的handleMessage拿到的msg就是被修改之后的msg
3. 当前handler自身的handleMessage

从消息队列中获取下一条消息
在这里插入图片描述
在无限for循环中调用native层的nativePollOnce函数,这个函数其实是阻塞在for循环中的,目的是为了监听别的线程对当前线程喂消息,或者超时,就会唤醒返回,继续执行下面的代码。接着从消息队列(其实就是单链表)的表头取出一条消息,标记msg在使用中并返回。
是什么时候把msg标记为未使用的呢?
不是消息在recycle的时候,而是在Message.obtain()的时候,及将消息从空闲链表取出来的时候标记消息为未使用
超时时间默认为0,也就是说第一次无论如何都是会从消息队列读取消息的,如果没有读取到消息,这个超时时间可能就会被设置成-1了,会一直等待下次消息enqueue。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建handler:
Looper.myLooper()获取当前线程的looper,判断当前线程是否有looper,如果没有,则需手动创建Looper.prepare(),否则抛出异常
在prepare函数中会从sThreadLocal.get()获取当前线程的looper,如果不为null,则抛出异常,提示每个线程只允许有一个Looper实例。如果为null,则new 一个Looper对象并将其保存在sThreadLocal中,sThreadLocal.set(new Looper(quiteAllowed)).Looper实例化的时候有做了什么呢,创建MessageQueue的java层实例,并用mThread变量保存looper当前的线程信息。在实例化java层的MessageQueue的时候,执行native层的init初始化函数,初始化native层的messageQueue,在初始化native层的messageQueue的时候,同时初始化native层的Looper
子线程
sendMessage()->sendMessageDelayed()->sendMessageAtTime()->enqueueMessage->nativeWake() 标记eventFD计数,唤醒Looper.looper()–>queue.next()的阻塞,dispatchMessage

MUSIC算法翻车?Toeplitz矩阵重构如何解决DOA估计中的相干信源难题 本文深入探讨了MUSIC算法在相干信源DOA估计中失效的根本原因,并详细介绍了基于Toeplitz矩阵重构的协方差矩阵修复技术。该方法通过凸优化恢复协方差矩阵的理想结构,有效解决了信号子空间秩亏损问题,从而显著提升了MUSIC算法在相干和多径场景下的分辨精度与稳健性。 阅读详情

相关推荐

AWR1642+DCA1000EVM 不使用mmWave Studio软件采集原始ADC数据 Timeout问题汇总

DCA1000 EVM Timeout问题汇总

Jesy_Hsu的博客 1476

探究Handler+Message机制的原理

我们经常会遇到这样一种情况,在子线程中去获取数据,然后需要在主线程里面使用数据,怎样将子线程中的数据发送到主线程中去呢?Handler+Message就具有这个能力,至于它是如何完成这个功能的就是我们今天要研究的主题。首先来介绍一下它的几个核心成员: 1. Handler: 就是用来发送消息和处理消息的。 2. Message: 消息对象中封装了几个重要的信息,int what

kbqf24的博客 720

面试篇 - LoRA(Low-Rank Adaptation) 原理

输出示例:trainable params: 262,144 || all params: 6,742,016,000 || trainable%: 0.0039。论文实验显示:零初始化 BB 可使初始损失与预训练模型相差不足0.1%,而非零初始化可能差50%+。若初始 ΔW≠0,模型可能立即偏离预训练学到的知识(如GPT-3突然忘记如何造句)。:如同汽车改装,先保持原厂配置(W),再逐步加装新部件(ΔW),避免直接飙车失控。:大模型的权重变化矩阵 ΔWΔW 通常是低秩的(少数主成分主导变化)。

qq_60245590的博客 1153

Handler中sendMessageAtTime 和sendMessageDelayed的区别

sendMessageAtTime 使用的uptimeMillis依赖的是系统以开机时间的绝对时间;而sendMessageDelayed使用的delayMillis依赖的是系统以开机时间的相对时间。啥意思呢:就是说delayMillis使用的时候要加一个SystemClock.uptimeMillis(),也就是sendMessageAtTime等于snedMessageDelayed的情况为u...

hacker_crazy的专栏 5162

Arduino——GY39大气压、温湿度、光照模块

前几天买东西的时候买了一个GY39,这个模块集成了温湿度,大气压,海拔,光照一体,使用起来很方面。它有两种工作模式使用串口模式时需要搭配转接板,我选择了IIC模式,看一下通信协议吧,就是关于高八位和低八位的数据。看一下接线。

戚晨夕的博客 2605

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3504

【Android 开发】: Android 消息处理机制之三: Handler 中 sendMessage() 源代码剖析

在前面的两件中我们学习了Handler和Message的基本使用方法[Android消息处理机制之Handler与Message],还有Message中obtain()的几种重载方法的使用方式的不同[Android消息处理机制 Message中 btain()源代码剖析],这一讲我们来学习一下Handler中的sendMessage()的几种重载方法的使用方式的不同以及它们的源代码的剖析

AHuier_Techblog :如果我不在写代码,你就 @me 4万+

InvocationException: GraphViz‘s executables not found【BUG已解决】

在机器学习框架中遇到了一个bug:安装了GraphViz模块后,在对着sklearn的决策树文档操作输出决策树模型结果时,还是爆出了如下的错误: 报错位置为: 报错语句为:网上很多答案告诉我们,要我们安装GraphViz模块,然而并不对! 如下,我安装了GraphViz,但是还是报错了。 所以说问题不在这,我查阅质料发现,改正这个bug的方法有一个:下文详细描述。解决bug为: 1.去graphviz.官方下载自己电脑符合的操作系统的安装包:2,安装的时候,记住自己安装在电脑里的位置:以我的电脑为例,我的

一键难忘的博客 3968

【Android消息处理机制】Handler中sendEmptyMessage与sendMessage的区别和sendMessageAtTime()与sendEmptyMessageDelay()区别

1、sendEmptyMessage与sendMessage的区别: sendMessage()允许你处理Message对象(Message里可以包含数据,)。 sendEmptyMessage(int what)只能放数据。其中参数what作用:就类似于ID,处理消息的时候用于区分你send一个0和1,处理的时候就要判断了if(msg.what == 0){}else if(msg.wh

cangchen的专栏 4万+

思维链:让AI更接近人类思维的技术

本文将探讨一种名为“思维链”的技术,它旨在让AI更接近人类思维。文章首先介绍了问题背景与核心概念,接着讲解了算法原理和数学模型,随后阐述了系统分析与架构设计,最后通过项目实战展示了思维链的实际应用,并提供了最佳实践和小结。思维链是一种旨在模拟人类思维过程的技术,它通过构建一系列相互关联的思维方式,实现对复杂问题的分析和解决。思维链算法是一种基于人类思维过程的人工智能算法,它通过构建一系列思维链,实现对问题的分析和解决。智能问答系统是一种常见的人工智能应用,它能够回答用户提出的各种问题。

AI天才研究院 943

【量化入门】Tushare库获取公募基金的历史净值

在本文中,我们将介绍如何使用Python的Tushare库获取公募基金的历史净值。

木头大左的博客 1144

Android 线程间通信机制 —— Handler消息通信

Android Handler Looper Message MessageQueue

Yang_Mao_Shan的博客 1461

利用Python爬虫采集京东商品评论情感分析案例(含完整代码)

在电商蓬勃发展的今天,商品评论蕴含着巨大的商业价值。本文以京东商品评论为研究对象,系统介绍如何使用Python构建一个完整的评论采集与情感分析系统。文章涵盖京东反爬机制分析、动态请求模拟、评论数据解析、中文文本预处理、基于SnowNLP和深度学习的情感极性分类、以及可视化展示等完整技术链路。所有代码均基于2025-2026年最新可用接口编写,并提供可直接运行的完整源码。全文力求详实,总字数逾八千字,适合Python数据分析从业者、电商运营人员及自然语言处理初学者参考实践。目录摘要第一章 引言。

2201_76125261的博客 88

深入理解Handler(二) --- 从源码角度来理解Android线程间消息传递机制

一、概述 本篇通过源码分析Android线程间消息传递机制 消息机制主要包含: Message:消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息; MessageQueue:消息队列的主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next); Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage); Loop

soso密斯密斯的博客 601

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

面试官:看过Handler源码吗?请简单说说Android线程间消息传递机制?

面试官最最常问的就是: 看过Handler源码吗?请简单说说Android线程间消息传递机制? 这种情况下,首先我们要先理清回答的思路,然后用我们的结构化思维去征服面试官!(心虚~) (一脸谄媚的)我:是这样的,Android线程间消息传递主要大体可以分为以下几个部分:消息发送、消息循环、消息分发,接下来我具体讲讲这三个部分的实现逻辑。 1、消息是怎么发送的? 这个问题还可以进行引申:...

Aerfa789的博客 676

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Android 源码剖析 ActivityThread Looper MessageQueue Message Handler 线程间通信 消息传递机制

1.ActivityThread ActivityThread 就是主线程,道友们要想知道它的创建由来请看 本人这篇博客:Android 手机上电到 App 启动到 界面刷新全过程 源码中ActivityThread解释如下,可以说对activity 服务 广播 等管理,生命周期维护、界面的刷新,都是在这个主线中处理的。 /** * This manages the executi...

进击的程序员 461

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

安卓消息机制之Handler基础知识

相信大家从网上也看到过Handler的代码解析,下面我将从我个人理解的角度,以尽量通俗易懂的语言带领大家对Handler的用法以及源码设计进行解读。

weixin_39330114的博客 1452

Android中的Handler机制

来自: http://www.cnblogs.com/keyindex/articles/1822463.html 前言   学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用。从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的学习研究方向。这里我首先选择了jwood的 Standup Timer ...

优秀技术文章收录 318

Android Message机制及其应用

FROM:http://blog.sina.com.cn/s/blog_49f62c350101gts9.html正如其他GUI应用程序一样,Android应用程序也是消息(事件)驱动的。这种消息的传递必须依赖于应用框架提供的消息机制。Android本身提供了2种消息机制: ·        组件间消息传递 --- Intent ·        线程间消息传递 --- Message  本文主要...

weixin_33801856的博客 95

Android线程间通信的Message机制

Android线程间通信的Message机制

wukunting的专栏 2716

Android中对Handle机制的理解

一、重要参考资料  【参考资料】     目前来看,下面的几个网址中的内容质量比较不错,基本不需要再读别的网址了。  1、android消息机制一     http://xtfncel.javaeye.com/blog/663517   Android消息机制(一)  一、    角色描述  1.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message

超宇的博客 6458

Android handler机制浅析

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

泥土的博客 436

android消息机制

今天学习android的消息传递机制,一直都在面试招聘的网站上面看到,其中要求的专业技能是掌握熟悉android的消息传递机制,今天就特别的把android的消息传递机制的相关理论知识,研究一下,等接下来的时候完善android实际的操作代码 关于android消息传递机制的核心类有: HandlerThread,这个是用于启动消息管道Looper的线程 Loop

ljz2009y的专栏 1322

Android消息传递机制浅析

1.Looper、Handler、MessageQueue的关系 Looper 用于线程的消息循环,一个线程只能有一个Looper对象 Handler 执行任务调度和发生一些操作(在未来某时刻) 执行其他线程中的队列消息 MessageQueue 消息队列 一个Looper对应一个MessageQueue,并不断从MessageQueue中取出消息,提交给Handel处理。 2.Looper以主

_StriveG的专栏 3026

活用Android线程间通信的Message机制

 1.1.Message代码在frameworks/base/core/java/android/Os/Message.java中。 Message.obtain函数:有多个obtain函数,主要功能一样,只是参数不一样。作用是从Message Pool中取出一个Message,如果Message Pool中已经没有Message可取则新建一个Message返回,同时用对应的参数给

因为了解所以无知 1594

Android线程间的消息传递

一、UI线程往其他Theard传递消息 1、UI端传递方式: A、首先让handler ontain一个message B、然后sendToTarget 2、其他Thread接受UI线程传递内容: A、实现run方法 B、Looper初始化:Looper.prepare C、Handler对象初始化:实现handlerMessage方法 D、Looper loop循环等待 new MyTh...

做你想做的,在所不惜。 2804
上一篇: 关于Handler的一些思考
下一篇: Handler消息延迟机制是怎么实现的?
Alrict
博客等级 码龄10年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值