Handler.postAtTime vs Handler.postDelayed

ben*_*n75 6 java android

android Handler类包含此方法:

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)
Run Code Online (Sandbox Code Playgroud)

在给定时间发布Runnable.在token以后可以用于去除回调r从消息队列由于这种方法:

public final void removeCallbacks (Runnable r, Object token)
Run Code Online (Sandbox Code Playgroud)

Handler类中不存在以下方法

public final boolean postDelayed (Runnable r, Object token, long delay)
Run Code Online (Sandbox Code Playgroud)

有没有提供这种方法的充分理由?

wts*_*g02 5

查看源代码后,令牌对象最终传递给Message:

public final boolean postAtTime(Runnable r, Object token, long uptimeMillis)
308    {
309        return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
310    }

private static Message getPostMessage(Runnable r, Object token) {
608        Message m = Message.obtain();
609        m.obj = token;
Run Code Online (Sandbox Code Playgroud)

和postDelay

 public final boolean postDelayed(Runnable r, long delayMillis)
330    {
331        return sendMessageDelayed(getPostMessage(r), delayMillis);
332    }
Run Code Online (Sandbox Code Playgroud)

如果你想要的是

public final boolean postDelayed (Runnable r, Object token, long delay)
Run Code Online (Sandbox Code Playgroud)

那么为什么不用

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)
Run Code Online (Sandbox Code Playgroud)

因为它一样.

更新,忘了添加这个:

public final boolean sendMessageDelayed(Message msg, long delayMillis)
442    {
443        if (delayMillis < 0) {
444            delayMillis = 0;
445        }
446        return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
447    }
Run Code Online (Sandbox Code Playgroud)