Android應用程式也是訊息驅動的,按道理來說也應該提供訊息迴圈機制。實際上Google參考了Windows的訊息迴圈機制,也在Android系統中實現了訊息迴圈機制。
Android通過Looper、Handler來實現訊息迴圈機制,Android訊息迴圈是針對線程的(每個線程都可以有自己的訊息佇列和訊息迴圈)。
本文深入介紹一下Android訊息處理系統原理。
Android系統中Looper負責管理線程的訊息佇列和訊息迴圈,具體實現請參考Looper的源碼。 可以通過Loop.myLooper()得到當前線程的Looper對象,通過Loop.getMainLooper()可以獲得當前進程的主線程的Looper對象。
前面提到Android系統的訊息佇列和訊息迴圈都是針對具體線程的,一個線程可以存在(當然也可以不存在)一個訊息佇列 和一個訊息迴圈(Looper),特定線程的訊息只能分發給本線程,不能進行跨線程,跨進程通訊。但是建立的背景工作執行緒預設是沒有訊息迴圈和訊息佇列的,如果想讓該線程具有訊息佇列和訊息迴圈,需要線上程中首先調用Looper.prepare()來建立訊息佇列,然後調用Looper.loop()進入訊息迴圈。如下例所示:
這樣你的線程就具有了訊息處理機制了,在Handler中進行訊息處理。
Activity是一個UI線程,運行於主線程中,Android系統在啟動的時候會為Activity建立一個訊息佇列和訊息迴圈(Looper)。詳細實現請參考ActivityThread.java檔案。
Handler的作用是把訊息加入特定的(Looper)訊息佇列中,並分發和處理該訊息佇列中的訊息。構造Handler的時候可以指定一個Looper對象,如果不指定則利用當前線程的Looper建立。詳細實現請參考Looper的源碼。
一個Activity中可以建立多個背景工作執行緒或者其他的組件,如果這些線程或者組件把他們的訊息放入Activity的主線程訊息佇列,那麼該訊息就會在 主線程中處理了。因為主線程一般負責介面的更新操作,並且Android系統中的weget不是安全執行緒的,所以這種方式可以很好的實現Android界 面更新。在Android系統中這種方式有著廣泛的運用。