AHandler简析

今天, 我们来看看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框架的时候, 各位童鞋们就能看到其中的奥妙了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容