当前位置: 首页 > article >正文

【Android】AHandler/AMessage/ALooper机制

以MediaCodec.cpp中, mCodecLooper 成员的使用来说明

init() 函数中
if (mCodecLooper == NULL) {
    mCodecLooper = new ALooper;  // 构造ALooper
    mCodecLooper->setName("CodecLooper");  //设置消息处理线程的线程name,方便trace分析查看
    mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); //创建消息处理线程,新线程loop()循环检测主AHandler发来的消息
}
  // 将mCodec这个AHandle与关联的Alooper注册保存起来,
  // 注册后, AHandle发送的消息,才能找到对应的ALooper,并post
  // ALooper才能收到消息并调用AHandler的onMessageReceived来处理
    mCodecLooper->registerHandler(mCodec);

reset() 函数中
if (mCodecLooper != NULL) {
    //清理掉 mCodec这个AHandler相关联的Alooper, 此AHandler再发的消息,就没有ALooper发送了
    mCodecLooper->unregisterHandler(mCodec->id());
}

以下是具体的调用流程
在这里插入图片描述
在这里插入图片描述
由于刚刚 registerHandler的对象是MediaCodec的 mCodec, 可能是ACodec,也可能是 CCodec,
这里以 ACodec为例, 简单说明 AMessage 的post与 处理流程

在这里插入图片描述

从图可知, AHandler post AMessage时, 最终会在新线程中调用AHandler (其子类)的 onMessageReceived() 函数来处理

注意
1个ALooper可能对应多个AHandler,但一个Handler只能有一个ALooper,
这样多个Handler共用一个ALooper时,其发送的消息共用一个消息队列(同一个ALooper的mEventQueue),
但AMessage的AHandler是确定的, 故调用 AMessage::deliver() -> Ahandler::deliverMessage() -> xxx::onMessageReceived()
就分发至各自的AHandler中来处理了

结论

由上可知

APP通过 MediaPlayer.java的方式来使用MediaCodec.cpp时,
NPDecoder-CL 是 NuPlayer创建MediaCodec时,
此线程处理 MediaCodec类 以及 非Video Codec的 ACodec 类中的相关信息;
因为在MediaCodec.cpp中, 针对非Video Codec时, registerHandler(mCodec)
还 registerHandler(this)

APP通过 MediaCodec.java的方式来使用MediaCodec.cpp时,
有 MediaCodec_looper 消息处理线程,
此线程不仅处理 JNI中 JMediaCodec 类的消息,
还处理 MediaCodec类 以及 非Video Codec的 ACodec 类中的相关信息;

CodecLooper 线程处理 Video Codec的 ACodec 类中的相关信息;

由上可知,ALooper注册了哪些AHandler, 则其消息处理线程均会处理对应的AHandler的信息
所以分析Trace的时候,先确定消息处理线程的name, 再查看代码其注册的AHandler,最后确定处理的消息

为了方便查找,如下列举了一些 Thread Name以及对应处理的AHandler的类
在这里插入图片描述


http://www.kler.cn/news/364009.html

相关文章:

  • 深度学习调参大法
  • 【LeetCode:910. 最小差值 II + 模拟 + 思维】
  • 2024昆明ICPC A. Two-star Contest(直观命名+详细注释)
  • Bytebase 3.0.0 - AI 助手全面升级
  • VMware虚拟机中centos磁盘扩容(非VG分区挂载方案)
  • 【Flutter】基础组件:文本及样式
  • Java:关于哈希表
  • 2024年808数据结构答案
  • css知识点梳理
  • 如何在服务器上部署开源大模型 GLM-4-9B-Chat 并应用到RAG应用中
  • 【传知代码】机器学习在情绪预测中的应用(论文复现)
  • 虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通
  • IDEA无法生成自动化序列serialVersionUID及无法访问8080端口异常的解决方案
  • 计算机毕业设计PySpark+大模型农产品推荐系统 农产品爬虫 农产品商城 农产品大数据 农产品数据分析可视化 PySpark Hadoop
  • 【亚马逊云】基于 Amazon EKS 搭建开源向量数据库 Milvus
  • 【ArcGIS Pro实操第4期】绘制三维地图
  • Java如何自定义线程池
  • Python + 查看个人下载次数小工具 - 记录
  • 【.Net】【C#】Program.cs通用代码模板
  • AJAX中get和post的区别
  • 【自动化测试之oracle数据库】MacOs如何安装oracle- client
  • Matlab|电价负荷需求响应-考虑电价变动
  • 线性可分支持向量机的原理推导 9-25对拉格朗日函数L(w,b,α) 关于w求导 公式解析
  • 深入浅出神经网络:从基础原理到高级应用
  • mysql 13 MySQL基于规则的优化
  • 解决ElasticSearch启动成功却无法在浏览器访问问题