Handler.postAtTime vs Handler.postDelayed

时间:2013-02-04 15:38:08

标签: java android

android Handler类包含此方法:

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)

在给定时间发布Runnable。由于此方法,以后可以使用token从邮件队列中删除对r的回调:

public final void removeCallbacks (Runnable r, Object token)

Handler类

中的以下方法不存在
public final boolean postDelayed (Runnable r, Object token, long delay)

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

4 个答案:

答案 0 :(得分: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;

和postDelay

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

如果你想要的是

public final boolean postDelayed (Runnable r, Object token, long delay)

那么为什么不使用

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)

因为它一样。

更新,忘了添加:

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    }

答案 1 :(得分:2)

查看Handler源代码,似乎有:

private final Message getPostMessage(Runnable r, Object token) {
    Message m = Message.obtain();
    m.obj = token;
    m.callback = r;
    return m;
}

可以根据需要复制:不要调用postDelayed,而是将runnable包装在这样的消息中

sendMessageDelayed(getPostMessage(r, token), delayMillis);

然后,您可以将removeCallbacks()与令牌作为参数

一起使用

答案 2 :(得分:1)

这是一个古老的问题,但是在API 28 中添加了以令牌为参数的postDelayed方法版本:请参见https://developer.android.com/reference/android/os/Handler#postDelayed(java.lang.Runnable,%20java.lang.Object,%20long)

对于较旧的API版本,如果需要令牌来稍后删除回调,则仍然必须使用postAtTime

答案 3 :(得分:0)

要从处理程序H中删除postDelayed runnable r,只需调用H.removeCallbacks(r)。为什么需要令牌?