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

【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 handler
        return 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,以区分不同的handler
    wp<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数量+1

    if (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.kler.cn/a/375533.html

相关文章:

  • Vue3和Springboot前后端简单部署
  • SpringBoot旋律线:Web音乐网站构建
  • 事件的传递
  • Python和MATLAB都可以用于绘制折线图,下面是分别用Python和MATLAB绘制简单折线图的示例。
  • AWS EC2 AMI 跨账号备份解决方案文档
  • redis详细教程(6.主从复制)
  • (10)文件操作
  • linux虚拟机上使用USB转串口工具
  • HTTP 全知道:请求与响应的深度剖析
  • Spring Boot JPA中的Page组件详解
  • 【时间之外】IT人求职和创业应知【23】
  • 【日常记录-Java】JarFile
  • Gorilla Mk1机器人:CubeMars电机加持,助力高空作业新突破
  • 3259. 超级饮料的最大强化能量
  • 【AI人工智能】给GPT一个英文文档,让它进行翻译,总结。
  • linux图形化X窗口
  • 商品详情API接口系列(json数据示例演示)
  • Lucene的使用方法与Luke工具(2)
  • 基于redis实现延迟队列
  • 【Docker项目实战】使用Docker安装Blossom 笔记应用
  • 【LangChain系列4】【Chain模块详解】
  • 【2025最新整理】ResNet 系列网络的演进及其创新
  • lanqiaoOJ 3255:重新排队 ← STL list 单链表
  • 【贪心算法】(第十三篇)
  • Linux---cp命令
  • 【p2p、分布式,区块链笔记 Torrent】WebTorrent 的lt_donthave插件