Looper中的訊息佇列處理機制

broadviewbj發表於2013-01-31

Looper中的訊息佇列處理機制

Looper也提供了訊息的定義、訊息的傳送、訊息的處理者的自定義和訊息佇列。在其標頭檔案Looper.h中,定義了訊息結構體Message,它只有一個型別成員,Message的定義如下(見檔案Looper.h,下同):

訊息的處理者可由MessageHandler進行處理:

使用者可透過派生出子類來擴充套件訊息。對訊息的處理,需要在MessageHandler的子類中過載handleMessage函式。

它們將被封裝到訊息“信封”MessageEnvolope中,然後送到訊息佇列中。MessageEnvolope的定義如下:

Looper中維護著一個自己的訊息佇列:

可以使用Looper的sendMessageAtTime(另外兩個版本也最終都使用的是sendMessageAtTime)向訊息佇列中傳送訊息:

訊息傳送函式將根據實參,將它們打包到訊息信封中,然後放置到訊息佇列中。最後,若訊息佇列中原先沒有訊息(即在接收方睡眠等待),則讓wake函式寫入字元到管道寫端喚醒接收方在pollInner中epoll_wait上的睡眠等待,讓其開始對訊息接收處理。pollInner對訊息佇列的處理的程式碼片段如下:

當醒來後,在上面的行275若檢查到訊息佇列不為空,則檢查佇列上的第一項是不是超時了。若超時了,則取下它,呼叫訊息信封中指定的MessageHandler的handleMessage函式去處理訊息(行294)。

因此,藉助於Looper的sendMessageXXX函式和pollOnce函式,可以向Looper內部的訊息佇列傳送訊息,這時pollOnce的呼叫者將被喚醒去處理訊息,當訊息處理完畢和沒有訊息時,將會睡眠等待。

本文節選自《深入剖析Android系統》一書

楊長剛 著

電子工業出版社出版

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-753624/,如需轉載,請註明出處,否則將追究法律責任。

相關文章