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:
    //純虛函數(shù), 具體的實現(xiàn), 在Nuplayer結構中, 由各個繼承于AHandler的類來實現(xiàn)
    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并不復雜, 現(xiàn)在來看看關鍵方法具體是如何實現(xiàn)功能的.

定義

#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. 增加交付了的消息的計數(shù);
  3. 如果是設置了 mVerboseStats.
  1. 把設置的what(AMessage中會看到, 這里只需要知道是發(fā)送消息的標識, AHandler會通過這個標識, 在onMessageReceived中尋找對應的方法來處理)
  2. mMessages是在頭文件定義的. 它長這個樣子 KeyedVector<uint32_t, uint32_t> mMessages;. 哦, 原來它是個鍵值對. 在ssize_t idx = mMessages.indexOfKey(what);中 獲取到了idx(其實就是計數(shù)).
  3. 最后, 判斷下. 如果這個計數(shù)中的what未被交付過, 設置為1; 否則, idx計數(shù)加一.

小結

AHandler中重要的是在onMessageReceived處理邏輯中, 而在此只是聲明了一個純虛函數(shù), 在今后分析Nuplayer框架的時候, 各位童鞋們就能看到其中的奧妙了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末婿崭,一起剝皮案震驚了整個濱河市肴颊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌苫昌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袜硫,居然都是意外死亡,警方通過查閱死者的電腦和手機帚称,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闯睹,“玉大人,你說我怎么就攤上這事始花『⑽” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵浇垦,是天一觀的道長荣挨。 經(jīng)常有香客問我,道長煌抒,這世上最難降的妖魔是什么厕倍? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任讹弯,我火速辦了婚禮这溅,結果婚禮上,老公的妹妹穿的比我還像新娘臭胜。我一直安慰自己癞尚,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布仪壮。 她就那樣靜靜地躺著胳徽,像睡著了一般爽彤。 火紅的嫁衣襯著肌膚如雪适篙。 梳的紋絲不亂的頭發(fā)上箫爷,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音丹喻,去河邊找鬼翁都。 笑死,一個胖子當著我的面吹牛鳍悠,可吹牛的內容都是我干的。 我是一名探鬼主播藏研,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蠢挡,長吁一口氣:“原來是場噩夢啊……” “哼凳忙!你這毒婦竟也來了?” 一聲冷哼從身側響起涧卵,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柳恐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乐设,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡巫俺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年介汹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘹承。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撼港,死狀恐怖骤竹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蒙揣,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布罩息,位于F島的核電站瓷炮,受9級特大地震影響递宅,放射性物質發(fā)生泄漏。R本人自食惡果不足惜办龄,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一土榴、第九天 我趴在偏房一處隱蔽的房頂上張望玷禽。 院中可真熱鬧呀打,春花似錦、人聲如沸贬丛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抄邀。三九已至,卻和暖如春剔难,著一層夾襖步出監(jiān)牢的瞬間奥喻,已是汗流浹背偶宫。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工纯趋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留结闸,地道東北人酒朵。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓蔫耽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親图甜。 傳聞我的和親對象是個殘疾皇子鳖眼,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理钦讳,服務發(fā)現(xiàn),斷路器缚去,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,127評論 25 707
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,140評論 30 470
  • 今天的數(shù)學卷子做到148。姑姑搞动,在復旦等我。
  • 班干部玉控,要充分發(fā)揮班干部責任高诺,激發(fā)責任感,每個人負責好自己的部分虱而,細化任務和責任。 組長牡拇,充分發(fā)揮組長的帶頭作用穆律,...
    小小秋姑娘閱讀 200評論 0 0