看下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开始。切记!切记!