Android Handler機制初探

Handler機制被廣泛的應用在Android應用層、framework層來進行一些併發性操作;這其中一個典型的應用就是在 工作線程中post一個狀態到UI線程

Handler 介紹

這裏主要從Handdler機制中的主要組成部分來進行說明;先看下類圖
class diagram

  1. 每個Thread擁有0或者1個Looper,並不是每個Thread都是從Looper派生。我們可以在我們想要用到Looper的地方先調用Looper.prepare(),在調用Looper.loop()來獲得looper,或者直接使用HandlerThread。這裏需要注意的是:Activity的main UI thread中的Looper是在Framework中已經被創建了,如果我們想要使用UI Thread的looper,則調用Looper.getMainLooper()即可
  2. 每個Looper擁有一個MessageQueue。Looper.loop()會輪詢MessageQueue,一旦有消息來臨就進行處理。
  3. Handler是用戶能見到的,需要實現自己代碼的一個類。Handler中主要包含obtainMessage() sendMessage() handleMessage等方法。任意一個Handler必須依附到一個Looper中。當調用sendMessage()時,Message會被髮送到Handler所持有的Looper的MessageQueue中去。用生產者/消費者模型來說:在這裏Handler就像是一個生產者,Looper就是一個消費者。在這裏需要注意的一點是 sendMessage()可以在任意的線程中調用,但是處理Message的代碼例如handleMessage則必須要運行在該Handler所持有的Looper中
  4. 一個Looper可以分配出多個Handlers,只要每個Handler處理各自類型的消息就可以啦。其實,當我們創建自己的Handler同主線程進行通信時,framework已經幫我們創建了很多的Handler來處理系統事件

    ActivityThread::H() , ViewRootImpl::ViewRootHandler

  5. 每個Message必須有一個目標Handler,並且改目標Handler實現了handleMessage()接口。sendToTarget()實際上是調用了mHandler.sendMessage(this);

使用Handler步驟

下圖向我們展示瞭如何在代碼中使用Handler
step follow
1. 創建一個Handler的子類,並實現handleMessage()方法
2. msg = handler.obtainMessage(what)從Handler的MessageQueue中獲得mes對象。當然這一步通常我們使用的直接new Message()
3. handler.sendMessage(msg)/handler.sendToTarget()將msg發送到handler的MessageQueue中
4. 由消息已經在MessageQueue中了,此時Looper的輪詢機制就會輪詢到了這個msg
5. 由looper將改msg發送給handler子類的handleMessage方法處理

這裏注意下,step1/step2/step3是通過我們在自己的代碼實現,step4/step5則有系統自動完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章