Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Handler消息機制完全解析(一)Message中obtain()與recycle()

Handler消息機制完全解析(一)Message中obtain()與recycle()

編輯:關於Android編程

提供obtain()

在obtain的所有重載方法中,第一行都是Message m = obtain();,即調用空參的方法。
先來看一下這個空參方法

public static Message obtain() {
    synchronized (sPoolSync) {
        if (sPool != null) {
            Message m = sPool;
            sPool = m.next;
            m.next = null;
            m.flags = 0; // clear in-use flag
            sPoolSize--;
            return m;
        }
    }
    return new Message();
}

很明顯,這是個同步方法,sPoolSync即鎖對象,該對象在定義時即被初始化private static final Object sPoolSync = new Object();,隨後便只讀不寫。
然後便是sPool,後面還有Message m = sPool;sPool = m.next;,很明顯可以看出來,這是一個鏈表結構。sPool指向當前message,next指向下一個message。
在解釋這段代碼前,需要先明確兩點:sPool聲明為private static Message sPool;next聲明為/*package*/ Message next;。即前者為該類所有示例共享,後者則每個實例都有。
現在為了便於理解,我們將Message抽象為C語言中的鏈表節點結構體,指針域便是用於指向下一個消息的next字段,其他則都視為數據域。
假設該鏈表初始狀態如下
初始狀態
執行Message m = sPool;就變成下圖
Message m = sPool
繼續sPool = m.next;
sPool = m.next
然後m.next = null;
m.next = null
接下來m.flags=0;sPoolSize--;return m;便是表示m指向的對象已經從鏈表中取出並返回了。

回收recycle()

然後再看看sPoolSize是什麼時候自增的。按圖索骥便可找到recycle()方法和recycleUnchecked()方法。前者供開發者調用進行回收,後者執行回收操作。來看看回收操作都干了啥:

void recycleUnchecked() {
    // Mark the message as in use while it remains in the recycled object pool.
    // Clear out all other details.
    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;
            sPool = this;
            sPoolSize++;
        }
    }
}

前半段不必多說,顯然是“重置”改對象的個個字段。後半段又是一個同步代碼段,同樣用圖來解釋一下(假設當前代碼為message.recycle(),則需要被回收的則是message對象)。
假設當前鏈表如下:
初始狀態
執行next=sPool;
next=sPool
執行sPool=this;
sPool=this
現在可以很清楚的看到,Message類本身就組織了一個棧結構的緩沖池。並使用obtain()方法和recycler()方法來取出和放入。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved