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

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

MessageQueue也是面試中與Handler、Looper是Handler問題套餐系列之一。那麼究竟它又有什麼潛在的知識點呢?讓我們一起從原始碼出發。

  • MessageQueue通過什麼方法將Message物件新增進來?在什麼時候執行該操作?
    MessagQueue通過enqueueMessage(Message,long)方法將Message新增進來,新增的主要流程為,如果該訊息沒有標記為正在使用,則將該msg標記為正在使用,並且該部分程式碼通過synchronized程式碼包裹,保證多執行緒操作也可以同步。接著就會將該message與MessageQueue位於頭部的message做對比,如果head message為null或者這個傳入的message物件的觸發時間為0,再或者,該message的觸發時間小於head message的觸發時間,則將該message新增至頭部,否則開始便利整個message queque,通過比較message的when,來插入排序。

  • 簡述一下MessageQueue的取Message的流程
    MessageQueue主要通過next()方法將佇列中的message提供給looper。該方法主要流程為:

    1. 首先判斷當前訊息佇列中位於頭部的是不是一個barrier,如果是的話,需要等到該barrier被移除為止
    2. 接著判斷當前head message如果不為null,也就是佇列中還有訊息需要處理,則會判斷當前時間與該head mesage的時間關係,如果當前訊息還沒有準備好,則計算需要等待的時間,也就是message.when-now。如果當前頭部message的when小於等於now,則立刻返回message物件。
    3. 在訊息佇列為空的時候,messagequeue還有一個idle handler機制,你可以通過新增idle handler物件,在佇列為空的時候,處理一些自己的業務,而不需要封裝msg。