Handler的removeMessages方法导致postDelayed的runnable没有执行的原因

看下Handler的postDelayed方法:

public final boolean postDelayed(Runnable r, long delayMillis){
   return  sendMessageDelayed(getPostMessage(r), delayMillis);
}

跟踪看下getPostMessage的方法:

private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callback = r;
    return m;
}

跟踪看下Message的obtain方法:

public static Message obtain() {
    synchronized (sPoolSync) {
        if (sPool != null) {
            Message m = sPool;
            sPool = m.next;
            m.next = null;
            m.flags = 0; // clear in-use flag
            sPoolSize--;
            return m;
        }
    }
    return new Message();
}

看下Message的构造方法:

public Message() {
}

跟踪到这里发现一直没有给Message指定what值,即通过Handler的postDelayed方法send的Message的what值使用的是int型的默认值0。
故当使用Handler时,如果removeMessages的what值是0,则postDelayed的Message也被移除了。


所以,使用Handler时,what值不能从0开始。切记!切记!

你可能感兴趣的:(Android)