1. 寫文章之前的聲明:首先,文章寫上原創標籤是有點牽強的,本質上是讀書筆記。上周周六的時候參加了博文視點的一個作者交流會,編輯送我了一本android核心方面的書《Android核心剖析》,拿回來讀了一下,非常的棒。首先作者知識豐富,對android認識很到位,水平比很多其他Android編者高不少。其次,水平高正常,寫書的嗎,都有點水平,但是作者寫書的時候,非常用心,語言通俗易懂,乾脆。這點就非常的難了。自己寫書的時候就有感覺,知道是一回事,表達出來,表達的清楚,又是另外一回事。最後,系列文章適合對android有一定認識的朋友,沒有android基礎的,不要看,浪費時間。
2.寫這些文章的意義:書中有大量的核心分析,其實對於應用程式層開發人員來說,這些東西用不上,我僅僅是把做應用程式開發用的上的東西抽出來,然後加一些自己的東西。
什麼是非同步訊息處理:
對於普通的線程來說,執行完run()方法內的代碼後線程就結束了。而非同步訊息處理線程是指:線程啟動後會進入一個無限迴圈體之中,每執行一次,從線程內部的訊息佇列中取出一個訊息,並回調相應的訊息處理函數,執行完一個訊息後則繼續迴圈。如果訊息佇列為空白,線程會暫停(一般也就是我們調用休眠方法),直到訊息佇列中又新的訊息。
非同步訊息處理特點:
從上面的描述可以看出,非同步訊息處理其實就是一種線程機制,只不過這種機制用的上的地方非常多,最後就單獨提煉了“非同步訊息處理”這個名詞。
非同步訊息處理的使用方式:
一般情況下,如果任務具有以下兩個特點,就可以使用非同步訊息處理機制:
1.任務常駐記憶體(編程中體現就是run()方法中是無限迴圈),比如用於處理使用者事件的任務。
2.任務需要根據外部傳遞的訊息做不同的操作。
通用的實現非同步訊息處理機制的方式:
1.每個非同步線程內部包含一個訊息佇列,用來緩衝訊息。
2.線程的執行中使用while(true)進行無限迴圈,迴圈體中從訊息佇列取出訊息,並根據訊息的來源,回調相應的訊息處理函數(從這裡可以看出:非同步訊息處理,訊息的具體處理並不是非同步訊息處理機制負責的,非同步訊息處理機制只是負責轉寄訊息給處理函數)
3.其他外部線程可以向本線程的訊息佇列發送訊息,由於有兩個或以上的線程訪問訊息佇列,那麼,訊息佇列內部的讀寫操作必須進行加鎖。
Android中非同步訊息處理的實現方式:
線上程內部有一個或多個Handler對象,外部線程通過該Handler對象的引用向本線程發送非同步訊息,訊息通過Handler對象加入訊息佇列(MessageQueue)。線程內部只有一個MessageQueue對象,線程的run()方法從MessageQueue中讀取訊息,並回調Handler對象中的回呼函數handleMessage()處理訊息。
在編程中應該注意的問題:
1.由於非同步訊息處理機制的一個重要環節是MessageQueue,所以,在發送訊息之前,必須確定MessageQueue已經建立。在android中,給應用程式員提供的建立MessageQueue的介面是:Looper.prepare()。
2.由於非同步訊息處理機制是一個迴圈線程,而迴圈的啟動也是由程式員控制的,所以,在你要處理訊息之前,應該啟動迴圈。在android中,給應用程式員提供的啟動迴圈的介面是:Looper.loop()。
3.細心的朋友可能發現,在activity中使用Handler發送,處理訊息時,並沒有上面兩步,其實是系統幫我們做了的。在建立Activity之前,系統就會為Activity建立一個非同步訊息處理線程。
作者“馮小衛”