今天, 我们来看看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
???
答: 确实就这一个方法咯
简要分析下:
-
onMessageReceived(msg);
把要交付的消息给到onMessageReceived
处理; - 增加交付了的消息的计数;
- 如果是设置了
mVerboseStats
.
- 把设置的what(AMessage中会看到, 这里只需要知道是发送消息的标识, AHandler会通过这个标识, 在onMessageReceived中寻找对应的方法来处理)
mMessages
是在头文件定义的. 它长这个样子KeyedVector<uint32_t, uint32_t> mMessages;
. 哦, 原来它是个键值对. 在ssize_t idx = mMessages.indexOfKey(what);
中 获取到了idx(其实就是计数).- 最后, 判断下. 如果这个计数中的what未被交付过, 设置为1; 否则, idx计数加一.
小结
AHandler中重要的是在onMessageReceived
处理逻辑中, 而在此只是声明了一个纯虚函数, 在今后分析Nuplayer框架的时候, 各位童鞋们就能看到其中的奥妙了.
网友评论