Android消息處理機(jī)制2——Message

Android消息處理機(jī)制系列文章整體內(nèi)容如下

Android消息處理機(jī)制1——Handler
Android消息處理機(jī)制2——Message
Android消息處理機(jī)制3——MessageQueue
Android消息處理機(jī)制4——Looper

定義

Defines a message containing a description and arbitrary data object that can be sent to a Handler.

這是Android文檔給的定義,翻譯成中文就是:
一個消息對象而叼,這個對象里面主要包含兩部分:Handler的描述和任意的數(shù)據(jù)對象耕突。
Message比較重要的概念的是消息池裙盾。

構(gòu)造器

Message只有一個默認(rèn)構(gòu)造器,不過為了更好的性能夺脾,應(yīng)該避免直接new 一個Message妄壶,而是使用obtain方法從消息池里面獲取一個Message對象。

消息池

Message會維護(hù)一個全局的消息池昧旨,消息池的數(shù)據(jù)類型是一個先進(jìn)后出的鏈?zhǔn)綏!南⒊厝∠⑼ㄟ^obtain()祥得,往消息池添加消息通recycleUnchecked()。

public static Message obtain(Message orig)
public static Message obtain(Handler h)
public static Message obtain(Handler h, Runnable callback)
public static Message obtain(Handler h, int what)
public static Message obtain(Handler h, int what, Object obj)
public static Message obtain(Handler h, int what, int arg1, int arg2)
public static Message obtain(Handler h, int what, int arg1, int arg2, Object obj)

上面的七個方法都會先調(diào)用obatin()方法從消息池里面獲取一個message蒋得,然后再根據(jù)傳入的參數(shù)對message進(jìn)行組裝级及。

取消息

public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool; //將當(dāng)前的message對象的引用傳給m
                sPool = m.next; //將第二個message(可能為null)的引用傳給sPool
                m.next = null; //斷開第一個message和第二個message的聯(lián)系
                m.flags = 0; // 清空 in-use標(biāo)志
                sPoolSize--; // 將消息池內(nèi)的消息數(shù)量減一
                return m;
            }
        }
        return new Message();
    }

取 obtain方法里面用的是synchronized,為了防止多個線程同時修改sPool時導(dǎo)致一些奇奇怪怪的事情發(fā)生额衙。
情形一:sPool為null饮焦,則會直接創(chuàng)建一個Message對象怕吴,這個新建的對象會在recycleUnchecked()里面回收,將它放到消息池县踢。最多存放50個message對象转绷。
情形二: sPool中有message對象,則會取出頭部的message硼啤,并且把消息池里的消息數(shù)量減一议经。

插入消息

void recycleUnchecked() {
        // 將message標(biāo)記為FLAG_IN_USE
        // 清空其他的屬性
        flags = FLAG_IN_USE;
        what = 0;
        arg1 = 0;
        arg2 = 0;
        obj = null;
        replyTo = null;
        sendingUid = -1;
        when = 0;
        target = null;
        callback = null;
        data = null;

        synchronized (sPoolSync) {
            if (sPoolSize < MAX_POOL_SIZE) {
                next = sPool; //讓回收的message的next屬性持有sPool的引用,這樣子谴返,就把這個message放到了鏈?zhǔn)綏5念^部了
                sPool = this; //sPool持有當(dāng)前message的引用
                sPoolSize++; //消息池內(nèi)的消息數(shù)量加一
            }
        }
    }

當(dāng)消息池里的message數(shù)量小于消息池的最大數(shù)量限制的時候煞肾,將message的屬性清空,并且標(biāo)記為FLAG_IN_USE嗓袱,然后放到消息池這個鏈?zhǔn)綏5念^部

(完)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末籍救,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子渠抹,更是在濱河造成了極大的恐慌蝙昙,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梧却,死亡現(xiàn)場離奇詭異奇颠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)篮幢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門大刊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人三椿,你說我怎么就攤上這事缺菌。” “怎么了搜锰?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵伴郁,是天一觀的道長。 經(jīng)常有香客問我蛋叼,道長焊傅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任狈涮,我火速辦了婚禮狐胎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歌馍。我一直安慰自己握巢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布松却。 她就那樣靜靜地躺著暴浦,像睡著了一般溅话。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上歌焦,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天飞几,我揣著相機(jī)與錄音,去河邊找鬼独撇。 笑死屑墨,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的券勺。 我是一名探鬼主播绪钥,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼关炼!你這毒婦竟也來了程腹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤儒拂,失蹤者是張志新(化名)和其女友劉穎寸潦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體社痛,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡见转,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒜哀。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩箫。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖撵儿,靈堂內(nèi)的尸體忽然破棺而出乘客,到底是詐尸還是另有隱情,我是刑警寧澤淀歇,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布易核,位于F島的核電站,受9級特大地震影響浪默,放射性物質(zhì)發(fā)生泄漏牡直。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一纳决、第九天 我趴在偏房一處隱蔽的房頂上張望碰逸。 院中可真熱鬧,春花似錦阔加、人聲如沸花竞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽约急。三九已至,卻和暖如春苗分,著一層夾襖步出監(jiān)牢的瞬間厌蔽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工摔癣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奴饮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓择浊,卻偏偏與公主長得像戴卜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子琢岩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345