AHandler简析

作者: TankWitch | 来源:发表于2017-08-13 13:07 被阅读0次

今天, 我们来看看AHandle的声明以及定义.
首先, 先来看看头文件是如何声明的(关键方法, 已附上简要说明):

声明

#ifndef A_HANDLER_H_

#define A_HANDLER_H_

#include <media/stagefright/foundation/ALooper.h>
#include <utils/KeyedVector.h>
#include <utils/RefBase.h>

namespace android {

struct AMessage;

struct AHandler : public RefBase {
    AHandler()
        : mID(0),
          mVerboseStats(false),
          mMessageCounter(0) {
    }
    //获取本handler的ID号(唯一)
    ALooper::handler_id id() const {
        return mID;
    }
    
    sp<ALooper> looper() const {
        return mLooper.promote();
    }
    //获取本handler注册其中的Looper
    wp<ALooper> getLooper() const {
        return mLooper;
    }

    wp<AHandler> getHandler() const {
        // allow getting a weak reference to a const handler
        return const_cast<AHandler *>(this);
    }

protected:
    //纯虚函数, 具体的实现, 在Nuplayer结构中, 由各个继承于AHandler的类来实现
    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;

private:
    friend struct AMessage;      // deliverMessage()
    friend struct ALooperRoster; // setID()

    ALooper::handler_id mID;
    wp<ALooper> mLooper;
    //***重要***: 将本handler注册到指定的Looper当中
    inline void setID(ALooper::handler_id id, wp<ALooper> looper)  
    {                  
        mID = id;
        mLooper = looper;
    }

    bool mVerboseStats;
    uint32_t mMessageCounter;
    KeyedVector<uint32_t, uint32_t> mMessages;
    //顾名思义, 交付消息
    void deliverMessage(const sp<AMessage> &msg);

    DISALLOW_EVIL_CONSTRUCTORS(AHandler);
};

}  // namespace android

#endif  // A_HANDLER_H_

可以看到, AHandler并不复杂, 现在来看看关键方法具体是如何实现功能的.

定义

#define LOG_TAG "AHandler"
#include <utils/Log.h>

#include <media/stagefright/foundation/AHandler.h>
#include <media/stagefright/foundation/AMessage.h>

namespace android {

void AHandler::deliverMessage(const sp<AMessage> &msg) {
    onMessageReceived(msg);
    mMessageCounter++;

    if (mVerboseStats) {
        uint32_t what = msg->what();
        ssize_t idx = mMessages.indexOfKey(what);
        if (idx < 0) {
            mMessages.add(what, 1);
        } else {
            mMessages.editValueAt(idx)++;
        }
    }
}

各位童鞋可能要吐瓜子了, 神马鬼, 就这一个AHandler::deliverMessage???
答: 确实就这一个方法咯

简要分析下:

  1. onMessageReceived(msg);把要交付的消息给到onMessageReceived处理;
  2. 增加交付了的消息的计数;
  3. 如果是设置了 mVerboseStats.
  1. 把设置的what(AMessage中会看到, 这里只需要知道是发送消息的标识, AHandler会通过这个标识, 在onMessageReceived中寻找对应的方法来处理)
  2. mMessages是在头文件定义的. 它长这个样子 KeyedVector<uint32_t, uint32_t> mMessages;. 哦, 原来它是个键值对. 在ssize_t idx = mMessages.indexOfKey(what);中 获取到了idx(其实就是计数).
  3. 最后, 判断下. 如果这个计数中的what未被交付过, 设置为1; 否则, idx计数加一.

小结

AHandler中重要的是在onMessageReceived处理逻辑中, 而在此只是声明了一个纯虚函数, 在今后分析Nuplayer框架的时候, 各位童鞋们就能看到其中的奥妙了.

相关文章

  • AHandler简析

    今天, 我们来看看AHandle的声明以及定义.首先, 先来看看头文件是如何声明的(关键方法, 已附上简要说明):...

  • 消息传递机制简析-AHandler/AMessage/ALoop

    前言 作为一只小菜鸟,在阅读到Android MediaPlayer相关的Nuplayer代码的时候,发现函数的调...

  • mybatis-spring解析

    1、概述 原生Mybatis源码简析(上)原生Mybatis源码简析(下)在介绍原生Mybatis源码简析文章中,...

  • 简析 Swift 的模块系统

    简析 Swift 的模块系统 简析 Swift 的模块系统

  • 简析Swift和C的交互

    简析Swift和C的交互 简析Swift和C的交互

  • shiro原理简析+基于springboot基础实践

    1、shiro原理简析 原理简析: 1、subject支持不通调用获取用户信息 2、SecurityManager...

  • Spring Boot启动流程简析

    Spring Boot启动流程简析 木叶之荣,2017年12月 Spring Boot启动流程简析(一) Spri...

  • ALooper简析

    接着ALooper、AMessage、AHandler的简述,现在来分析下ALooper的声明以及定义。 声明 这...

  • AMessage简析

    作为AMessage/ALooper/AHandler中最复杂的一环, AMessage被我放到了最后来讲. 希望...

  • 黑色的天空

    啊!简析又惊醒了,这已经是第三次了,自从简析从那个噩梦里回来,已经有三天了。简析不明白,为什么她会回来,回...

网友评论

    本文标题:AHandler简析

    本文链接:https://www.haomeiwen.com/subject/izasrxtx.html