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简析

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