【Android】の基礎——消息處理機制

這次主要談談以Handler、MessageQueue和Looper爲核心的消息處理機制。

故事

話說:一家公司,裏面有很多個辦公室分別負責處理不同的業務,每個辦公室都有一個工作簿,每次有新的業務需要處理,提出申請的部門就會把需要處理的業務告訴負責該業務辦公室的幹事,這個幹事就把需要處理的業務寫到了工作簿上面。每個辦公室都有一個辦公室主任,他的職責就是不斷的瀏覽工作簿,然後按照順序分配,當他瀏覽到這條任務的時候,就把他分配給剛纔寫下任務的那個幹事去完成。

這樣就構成了我們的消息處理機制。一個公司——相當於APP,它裏面會有很多的辦公室——相當於線程,去傳送業務的幹事以及去執行任務的幹事——都相當於Handler,辦公室主任則——相當於Looper,辦公室裏面的工作簿——相當於MessageQueue。

詳細

這裏寫圖片描述
Handler通過post和send(最終是通過send)的一系列方法累發送消息。最終會使被插入消息的MessageQueue調用enqueueMessage()方法,來插入這條消息(MessageQueue使用單鏈表存儲消息)。

Looper:在線程中,通過Looper.prepare()來創建Looper,通過Looper.loop()開始消息循環。他通過MessageQueue的next()方法來獲得消息。如果next()方法沒有返回,則阻塞等待;如果next()方法返回值爲null則退出這個死循環。

當Looper從消息隊列得到了Message,就會調用之前將這條Message插入隊列的Handler的dispatchMessage()來進行處理。

Handler的dispatchMessage():

  1. 檢查Message的callback是否爲null:
    1. 不爲null:調用handleCallback(msg),結束
    2. 爲null: 檢查mCallback是否爲null:
      1. 爲null:handleMessage(),結束
      2. 不爲null:執行mCallback的handleMessage()
        1. 如果返回true:結束
        2. 如果返回false:handleMessage(),結束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章