天天看點

Android之Handler源碼分析(第五篇:移除消息)

前言

    消息既然有發送,也可以去做取消 

Android之Handler源碼分析(第五篇:移除消息)

移除消息的方法,共計5個,今天一起學習一下它們是怎麼實作的?

removeMessages()方法分析

public final void removeMessages(int what) {
        mQueue.removeMessages(this, what, null);
    }
           

用于移除一組Message,Message持有的int值what隻要比對,都會被移除掉。傳入參數為int值,表示Message對象持有的一個int值

1、傳入的局部變量what持有的int值最終會傳入到Handler對象持有的MessageQueue對象mQueue的removeMessages()方法中

2、removeMessages接受三個參數,第一個參數是目前的Handler對象,第二個參數是目前傳入的整型what值,最後一個參數這裡傳入的是null,該參數接受的類型是Object。

3、MessageQueue會将消息隊列中,所有what值比對的未分發出去的Message對象全部移除掉

removeMessages()方法分析(重載方法:2個參數)

public final void removeMessages(int what, Object object) {
        mQueue.removeMessages(this, what, object);
    }
           

用于删除多個消息的方法,必須同時比對what值與object值的消息才會被移除。傳入的第一個參數為int,表示Message對象持有的int值,傳入的第二個參數為Object,表示Message對象持有的Object對象

1、同樣調用Handler對象持有的MessageQueue對象的removeMessages()方法,傳入的第一個參數為目前Handler對象,第二個參數為表示用于比對的int值,第三個參數為Object對象

2、MessageQueue對象的removeMessages()方法,會判斷隻有what值與object值同時與消息隊列中的消息所比對,才會被全部移除掉

removeCallbacks()方法分析

public final void removeCallbacks(Runnable r)
    {
        mQueue.removeMessages(this, r, null);
    }
           

用于移除多個消息,隻有Message對象持有同樣的Runnable對象,才會被移除調用,傳入的參數為一個Runnable對象,表示用于比對的條件

1、調用Handler對象持有的MessageQueue的removeMessages()重載方法,将目前Handler對象、傳入的Runnable對象、以及一個null值均傳了進去

2、此處會對消息隊列中的所有未執行的Message且比對Runnable的Message全部移除掉

removeCallbacks()方法分析(重載方法:2個參數)

public final void removeCallbacks(Runnable r, Object token)
    {
        mQueue.removeMessages(this, r, token);
    }
           

用于将Runnable對象與Object對象同時比對的所有Message對象,才會從MessageQueue全部移除

1、此處的token可傳null,此時該方法與上文中的一個參數的removeCallbacks()方法作用一樣

2、傳入的Runnable對象、Object對象全部會再傳入到MessageQueue的removceMessages()方法,完成消息移除工作

removeCallbacksAndMessages()方法分析

public final void removeCallbacksAndMessages(Object token) {
        mQueue.removeCallbacksAndMessages(this, token);
    }
           

用于删除多個Message的方法,隻要Message持有的token(一個Object對象)比對,即會被移除掉消息,而不再管Message對象持有的情況,隻判斷Message對象持有的token

總結

1、send系列方法送出的Message對象,需要移除的時候,可以選用參數帶有what的removeMessages()方法

2、post系列方法送出的Message,需要移除的時候選用參數為Runnable的removeCallbacks()方法

3、上文中removeXXX()方法的第一個參數均是目前Handler對象,說明這些移除方法隻是将MessageQueue中對應的Handler發送的消息進行移除操作

4、為一個Handler發送的Message對象,可以指定一個Object對象作為token,将來業務上如果不需要這些Message對象,可以根據token全部移除掉未運作的消息,大佬真貼心

5、被移除的Message都是未得到執行的Message,若已經執行的Message是不會在MessageQueue持有的單連結清單中出現的