AHandler简析

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

声明

#ifndef A_HANDLER_H_

#define A_HANDLER_H_

#include 
#include 
#include 

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 looper() const {
        return mLooper.promote();
    }
    //获取本handler注册其中的Looper
    wp getLooper() const {
        return mLooper;
    }

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

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

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

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

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

    DISALLOW_EVIL_CONSTRUCTORS(AHandler);
};

}  // namespace android

#endif  // A_HANDLER_H_

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

定义

#define LOG_TAG "AHandler"
#include 

#include 
#include 

namespace android {

void AHandler::deliverMessage(const sp &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 mMessages;. 哦, 原来它是个键值对. 在ssize_t idx = mMessages.indexOfKey(what);中 获取到了idx(其实就是计数).
  3. 最后, 判断下. 如果这个计数中的what未被交付过, 设置为1; 否则, idx计数加一.

小结

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

你可能感兴趣的:(AHandler简析)