Looper中的訊息佇列處理機制
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android應用程式訊息處理機制(Looper、Handler)分析AndroidOOP
- Android訊息處理機制(Handler、Looper、MessageQueue與Message)AndroidOOP
- 訊息機制篇——初識訊息與訊息佇列佇列
- RabbitMQ訊息佇列(九):Publisher的訊息確認機制MQ佇列
- Android中的非同步訊息處理機制Android非同步
- 訊息佇列中的Oracle佇列Oracle
- 請教mina處理訊息?需要建立訊息佇列?佇列
- Android 訊息機制:Handler、MessageQueue 和 LooperAndroidOOP
- Android Handler MessageQueue Looper 訊息機制原理AndroidOOP
- RabbitMQ訊息佇列(三):任務分發機制MQ佇列
- Windows應用程式的訊息處理機制Windows
- Android Handler機制之迴圈訊息佇列的退出Android佇列
- 訊息佇列系列一:訊息佇列應用佇列
- 訊息佇列佇列
- MQ 訊息佇列的解耦、介面非同步處理、削峰MQ佇列解耦非同步
- 原始碼分析:Android訊息處理機制原始碼Android
- Android應用程式訊息處理機制Android
- Cloud Foundry架構和訊息處理機制Cloud架構
- Handler訊息處理機制原始碼解析 上原始碼
- Android 訊息處理機制:Handler|MessageAndroid
- Service初探與非同步訊息處理機制非同步
- 老生常談——利用訊息佇列處理分散式事務佇列分散式
- 使用RabbitMQ訊息佇列來處理大規模的資料流MQ佇列
- WebRTC中的訊息機制Web
- 訊息佇列(MQ)佇列MQ
- Kafka訊息佇列Kafka佇列
- RabbitMQ訊息佇列MQ佇列
- kafka 訊息佇列Kafka佇列
- POSIX訊息佇列佇列
- 訊息佇列(一)佇列
- 訊息佇列(二)佇列
- 訊息佇列二佇列
- [訊息佇列]rocketMQ佇列MQ
- [訊息佇列]RabbitMQ佇列MQ
- [Redis]訊息佇列Redis佇列
- c# 透過訊息佇列處理高併發請求實列C#佇列
- Android訊息機制全面解析(Handler,MessageQueue,Looper,Threadlocal)AndroidOOPthread
- RabbitMQ 訊息佇列之佇列模型MQ佇列模型