Handler.postAtTime vs Handler.postDelayed



android Handler 类包含此方法:

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

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

public final void removeCallbacks (Runnable r, Object token)

以下方法在处理程序类中不存在

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

是否有充分的理由不提供这种方法?

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

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;

和后延迟

 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    }

查看处理程序源代码,似乎有:

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

可以复制您想要的内容:而不是调用postDelayed,将你的可运行对象包装在这样的消息中

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

然后,您可以将带有令牌的removeCallbacks()用作参数

这是一个

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

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

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

最新更新