1. 程式人生 > >【Android面試知識點系列】Handler相關

【Android面試知識點系列】Handler相關

和其他面試點一樣,我將 通過自己學習原始碼,來總結可能出現的問題點。再次鼓勵的大家通過原始碼學習Android或者其他語言的知識,原始碼之下,毫無隱瞞。
Handler作為Android中重要的一個類,在面試中經常被問到,也是Android跨執行緒通訊的好手段。

  • 談一談Handler在Android中的主要用途

    1. 安排Message或者Runnable物件在本執行緒中指定時間點執行
    2. 讓message或者Runnable在其他執行緒執行。
  • 是否使用過Handler(Handler.Callback)來構造Handler物件?Handler.Callback的主要用途
    是,該構造方法的引數的是一個介面,通過實現該介面的handleMessage方法可以自行處理message資訊,該方法的目的就是讓其他實現該介面的物件,自行處理相關資訊,而不用複寫內部類的handlemesssage。

  • 簡單說明一下Handler從傳送到處理一個message的流程。
    之前在Looper中講到過,Looper比作自動執行的傳送帶, Handler比作機械手臂 message就是一個個的包裹,而MessageQueue就是盒子組成的佇列。Handler通過SendMessage方法將message放進Handler繫結的Looper.meesageQueue中,而Looper在呼叫Looper.loop方法的時候,就會一直檢視message的相關資訊,最主要的是看它會被哪個Handler處理,這時候會呼叫msg.target.dispatchMessage方法,而在該方法中,會判斷該message是否存在callback物件,如果有的話,則會交給對應的callback物件處理,如果沒有則判斷自己的Handler.Callback是不是null,如果不是則交給它處理,如果是,則自行呼叫handleMessage處理。

  • Handler如何快速獲取一個Message物件?
    使用Handler.obtainMessage(),好處就是省去了new方法。也可以直接使用Message.obtain(this),效果是一樣的。

  • removeCallbacks與removeMessages的主要區別
    首先兩個方法傳參不一樣,一個是Runnable物件,一個是int 對應message.what
    可以看做是post和send的逆向操作。

  • 如何移除MessageQueue中的所有沒有被處理的訊息?
    呼叫removeCallbacksAndMessages,引數傳入null