你真的懂Android Handler嗎?(三)

你真的懂Android Handler嗎?(一)你真的懂Android Handler嗎?(二)這兩篇文章中我們瞭解了Handler是如何跟線程綁定的,也知道了Handler中消息傳遞的機制是通過無限for循環。但是我們還遺留了一些問題,比如MessageQueue中的數據結構是怎樣的?是一個先進先出的隊列嗎?在主線程中使用了無限for循環,爲什麼消息隊列爲空時沒有引起ANR呢?這些問題需要我們通過分析MessageQueue源碼來尋找答案。

對於第一個問題,MessageQueue是一個先進先出的隊列嗎?其實並不是,而是一個Message的單鏈表,MessageQueue中有一個mMessages屬性,它是一個Message類型的對象,它指向了單鏈表的頭。Message類中有一個next屬性,它也是Message類型的,它指向一個message的下一個節點。下面是MessageQueue和Message的部分源碼:

public final class MessageQueue {
    ......

    //消息隊列的頭
    Message mMessages;

    //標示next()方法是否被阻塞在pollOnce()處一段時間,具體時間由non-zero-timeout決定
    // Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout.
    private boolean mBlocked;
    ......
}


public final class Message implements Parcelable {
    
    public int what;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章