【android12】【AHandler】【3.AHandler原理篇AHandler类方法全解】

AHandler系列

【android12】【AHandler】【1.AHandler异步无回复消息原理篇】-CSDN博客

【android12】【AHandler】【2.AHandler异步回复消息原理篇】-CSDN博客

其他系列

本人系列文章-CSDN博客


1.简介

前面两篇我们主要介绍了有回复和无回复的消息的使用方法和源码解析,为了更好的理解Ahandler这个类的作用,本篇便主要对AHandler类的所有方法进行全解。

简单介绍一下Ahandler机制

AHandler是Android native层实现的一个异步消息机制,在这个机制中所有的处理都是异步的,将消息封装到一个消息AMessage结构体中,然后放到消息队列中去,后台专门有一个线程ALooper会从这个队列中取出消息然后分发执行,执行函数就是AHandler实例的onMessageReceived。

在AHandler中的消息分为不需要回复的消息和需要回复的消息。

不需要回复的消息:当被post到消息队列后,Alooper会从消息队列中取出消息,并发送给相应的Ahandler的onMessageReceived进行处理。

需要回复的消息:当被post到消息队列后,Alooper会从消息队列中取出消息,并发送给相应的Ahandler的onMessageReceived进行处理,处理完后,Ahandler会将想回复的消息返回给发送方,发送方接受返回的response消息。

1.1 主要类及其作用

AHandler:处理类,用于消息的处理,有一个纯虚函数onMessageReceived,一般需要继承此类并重写此方法,用于接受和处理消息。

AMessage:消息类,用于构建各种消息,通过post方法将消息发送给Alooper

Alooper:轮询类,用于保存消息队列,然后将消息发送到对应的AHandler

AReplyToken:这类似一个标识,表示要回复的是哪一条消息

 1.2 类图

2.源码解析

2.1 AHandler类

AHandler这个类一般用作子类,需要使用Ahandler机制通信时候,需要继承此类,并重写onMessageReceived这个方法。

struct AHandler : public RefBase {//RefBase类是andorid中用于引用计数的类AHandler(): mID(0),mVerboseStats(false),mMessageCounter(0) {}//默认构造函数的实现。ALooper::handler_id id() const {//函数后面+const表示常函数。不能修改成员属性的值return mID;}sp<ALooper> looper() const {//获取looper的强智能指针return mLooper.promote();}wp<ALooper> getLooper() const {//获取looper的弱智能指针return mLooper;}wp<AHandler> getHandler() const {// allow getting a weak reference to a const handlerreturn const_cast<AHandler *>(this);}protected:virtual void onMessageReceived(const sp<AMessage> &msg) = 0;//纯虚函数private:friend struct AMessage;      // deliverMessage(),//AMessage作为友元类,AMessage可以访问AHandler中的私有成员。friend struct ALooperRoster; //ALooper::handler_id mID;//用于设置handler的id,以区分不同的handlerwp<ALooper> mLooper;inline void setID(ALooper::handler_id id, const wp<ALooper> &looper) {mID = id;mLooper = looper;}bool mVerboseStats;//代表详细状态,主要用于dump信息时会用到uint32_t mMessageCounter;//表示消息的数量KeyedVector<uint32_t, uint32_t> mMessages;void deliverMessage(const sp<AMessage> &msg);//用于发送消息DISALLOW_EVIL_CONSTRUCTORS(AHandler);
};

2.2 AHandler::deliverMessage

1.从本系列的前面两篇,我们也应该十分清楚,最终looper会调用到deliverMessage方法,从而回到继承自AHandler子类我们重写的onMessageReceived中。

void AHandler::deliverMessage(const sp<AMessage> &msg) {onMessageReceived(msg);//此时便回到了继承Ahndler的子类的Ahandler中mMessageCounter++;//message数量+1if (mVerboseStats) {//默认mVerboseStats值为false,代表详细状态,主要用于dump信息时会用到uint32_t what = msg->what();ssize_t idx = mMessages.indexOfKey(what);if (idx < 0) {mMessages.add(what, 1);} else {mMessages.editValueAt(idx)++;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPRS是什么?

‌GPRS&#xff08;General Packet Radio Service&#xff09;‌是一种基于GSM&#xff08;Global System for Mobile Communications&#xff09;系统的无线分组交换技术&#xff0c;提供端到端的广域无线IP连接。与传统的GSM系统不同&#xff0c;GPRS采用分组交换技术&#x…

flutter 专题二 Flutter状态管理之Riverpod 0.8.4

一 、flutter 有哪些状态管理方式 Flutter的状态管理方式有很多&#xff0c;Redux、 Bloc、 MobX、Provider等等。单单一个Provider&#xff0c;我也见到了各种组合&#xff0c;例如ChangeNotifier Provider / StateNotifier Provider&#xff08; freezed&#xff09;。各…

海风里的青春:海滨学院班级回忆录开发

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

ts:用加减乘除方法配合展示类的继承(extends)

ts&#xff1a;用加减乘除方法配合展示类的继承&#xff08;extends&#xff09; 1 主要内容说明2 例子2.1 基类的创建2.1.1 源码1 &#xff08;基类的创建&#xff09;2.1.2 源码1运行效果 2.2 继承基类的参数和方法2.2.1 源码2&#xff08;继承基类的参数和方法&#xff09;2…

Minio 之 内网项目托管Unity Android包体

什么是 MinIO&#xff1f; MinIO 是一个开源的对象存储服务器&#xff0c;旨在提供高性能、高可用性和高扩展性的存储解决方案。它兼容 Amazon S3 API&#xff0c;适用于各种场景&#xff0c;如数据备份、数据归档、大数据分析和机器学习等。 主要特点 兼容性&#xff1a; Mi…

Java中的容器及其区别

|Collection |  ├List |  │-├LinkedList |  │-├ArrayList |  │-└Vector |  │ └Stack |  ├Set |  │├HashSet |  │├TreeSet |  │└LinkedSet | |Map   ├Hashtable   ├HashMap   └WeakHashMap 1、Java中的容器 Java容器类…

论文阅读- --DeepI2P:通过深度分类进行图像到点云配准

目前存在的问题&#xff1a; 单模态配准具有局限性&#xff0c;多模态研究很少跨模态图像到点云配准问题是求解相机坐标系与点云之间的旋转矩阵R ∈ SO(3)和平移向量t ∈ R3。 这个问题很困难&#xff0c;因为由于缺乏点到像素的对应关系&#xff0c;无法使用 ICP、PnP 和捆绑调…

大厂面试真题-如果使用guava limiter实现实例级别的缓存

Guava库中的RateLimiter和Cache是两个不同的组件&#xff0c;分别用于控制访问频率和实现缓存功能。RateLimiter用于流量控制&#xff0c;确保系统在处理请求时不会超过指定的速率&#xff0c;而Cache则用于存储数据以加快访问速度。 由于RateLimiter本身并不直接支持实现缓存…

Air780E如何发送SMS?一文详解!

今天一起来学习使用合宙低功耗4G模组Air780E发送SMS短消息&#xff1a; 一、SMS简介 SMS&#xff08;短消息服务&#xff0c;ShortMessageService&#xff09;功能主要用于在蜂窝网络中传输短消息。 在4G网络中&#xff0c;短信可以在数据传输的同时进行&#xff0c;不会因数…

【TC3xx芯片】TC3xx芯片PFlash的ECC校验问题补充

目录 前言 正文 1.PFlash的ECC监控l 1.1. PFlash的监控使能 1.2. PFlash的故障注入 2.DFlash的ECC监控 2.1. DF0 ECC Read Register 2.2. DF0 ECC Status Register 2.3. DF0 ECC Control Register 2.4. DF0 ECC Write Register 2.5. DF0 User Mode Control 3.总结 …

Centos 7系统一键安装宝塔教程

服务器推荐青鸟云服务器&#xff0c;2H2G低至16元/月 官网地址&#xff1a; 所有产品_香港轻量云 2核 2G-A型_青鸟云 推荐Finalshell软件连接至服务器&#xff0c;下载地址&#xff1a; https://dl.hostbuf.com/finalshell3/finalshell_windows_x64.exe 下载完成后连接服务…

知识吾爱纯净版小程序系统 leibiao SQL注入漏洞复现(XVE-2024-30663)

0x01 产品简介 知识吾爱纯净版小程序系统是一款基于微信小程序平台开发的知识付费应用,旨在帮助用户快速建立自己的知识付费平台,实现支付变现和流量主收益。它提供了简洁明了的用户界面和良好的用户体验,同时注重用户隐私保护,确保用户信息的安全存储和传输。 0x02 漏洞…

HTML前端页面设计静态网站

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一个网…

各大自媒体平台的感受 —— 小红书

如果你有些内容&#xff0c;想发布到自媒体平台上&#xff0c;目前有很多平台可用选择。 发布自媒体在获得关注的同时&#xff0c;同时也会期望有些收益。 我们的内容也发布了不少时间了&#xff0c;那就分别扒下各大自媒体平台的吃相&#xff0c;这篇文章说的是小红书。 收…

openEuler下配置openGauss环境图解

一、在openEuler中创建用户&#xff0c;并授予权限 # 创建用户 sudo adduser omm# 授予权限 chown omm /opt# 切换用户 su - omm 二、在openGauss官网找到openGauss极简版的软件包 openGauss软件 | openGauss下载 | openGauss软件包 | openGauss社区 右键立即下载&#xff0…

RabbitMQ 的集群

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ 的集群】面试题&#xff1f;希望对大家有帮助&#xff1b; RabbitMQ 的集群 RabbitMQ 是一种流行的开源消息代理&#xff0c;广泛用于构建分布式系统中的消息队列。随着应用程序规模的扩大&#xff0c;单一的 RabbitMQ 实…

[ 应急响应基础篇 ] Windows 写入任务计划程序详解--任务计划程序窗口写入 命令行写入

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

flinksql-Queries查询相关实战

分组聚合 --分组集 --GROUPING SETS() 允许你定义特定的分组方式&#xff0c;这样你可以选择只对感兴趣的分组进行计算。 --通过手动指定不同的分组组合&#xff0c;你能够灵活地控制数据的聚合结果。 --与 ROLLUP 和 CUBE 不同&#xff0c;GROUPING SETS 不会自动生成所有子集…

泄密与间谍:网络安全与国家安全的紧密联系

在当今数字化时代&#xff0c;网络安全已成为国家安全的重要组成部分。随着信息技术的迅猛发展&#xff0c;网络空间的安全问题愈发突出&#xff0c;泄密和间谍活动对国家安全构成了严峻挑战。本文将探讨泄密与间谍活动的影响&#xff0c;以及为何没有网络安全就没有国家安全。…

使用Git LFS管理大型文件

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Git LFS管理大型文件 引言 Git LFS 简介 安装 Git LFS 安装 Git 安装 Git LFS 配置 Git LFS 初始化 Git 仓库 指定需要使用…