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創建一個異步消息處理線程。
作者“馮小衛”