2014-12-02 16 views
3

我一直在尋找在Android文檔的postDelayed post delayed documentationpostDelayed是否會導致郵件跳到隊列的前端?

這類似於另一個問題 - https://stackoverflow.com/questions/25820528/is-postdelayed-relative-to-when-message-gets-on-the-queue-or-when-its-the-actual - 我有一段時間回來,但它是一個不同的情況(和措辭在我心中更加清晰)

基本上是繼承人文檔對此方法的說明 - 「導致Runnable被添加到消息隊列中,並在指定的時間過後運行,runnable將在用戶界面線程上運行。」

我知道每個線程都有一個消息隊列,循環和處理程序與之相關聯。 - What is the relationship between Looper, Handler and MessageQueue in Android?。 根據「在指定的時間過後運行」,如果您傳入0作爲delayMillis的參數,並且消息隊列中仍有消息,則帶0的消息是否會跳過其餘消息(消息隊列中直接由循環者處理)?我知道looper會將消息發送到Handler的handleMessage()方法 - 從How the Looper knows to send the message to Handler?。我會自己測試一下,但我不知道你會怎麼做。

回答

8

簡短的回答是 - 否,做一個postDelayed不跳在隊列中的其他非延遲工作。

兩個postpostDelayed兩個呼叫sendMessageDelayedpost使用的0。因此,postpostDelayed延遲具有零延遲是等效的。 (參見Handler source,從第324行開始)。 sendMessageDelayed指出在所有掛起的請求之後將消息放入隊列中。原因是每條消息都被排入隊列的時間加上可選的延遲。隊列按此時間值排序。如果您毫不拖延地排隊一條新消息,它將會跳過(放在延遲消息的前面),這些消息仍然沒有達到其交付時間,但不會在未決消息之前(那些超過其交付時間但尚未達到的消息交付)

作爲一個側面說明,如果你想請求跳過掛起的請求的行爲,你可以使用postAtFrontOfQueue,但一定要閱讀和理解警告說,這只是在特殊情況下使用。

+0

謝謝,但我認爲一個例子會清除它更多。假設我調用postDelayed(new Runnable(){....},50000)。這會在消息隊列的前面出現,因爲消息隊列中沒有其他內容。如果我添加另一個runnable,比如說post(new Runnable(){...}),那麼這個runnable必須等待50秒,因爲第一個帖子的「阻止操作」,因爲第一個帖子必須等待很長時間才能執行? – committedandroider 2014-12-02 04:06:04

+0

不,隊列的順序是由與消息關聯的時間決定的。對於未延遲的消息,這是當前時間。對於延遲的消息,它是當前時間加上延遲。因此,如果您不加延遲地排隊新消息,它將會跳過(放置在尚未達到交付時間的延遲消息之前)。更新了我的答案以提供此詳細信息。 – iagreen 2014-12-02 04:10:35