6

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

4 回答 4

5

看了源码,token对象最终传递给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    }
于 2013-02-04T16:08:23.133 回答
2

查看 Handler 源代码,似乎有:

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()with token 作为参数

于 2013-02-04T16:33:08.717 回答
1

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

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

于 2020-07-22T17:58:40.077 回答
0

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

于 2013-02-04T15:41:57.190 回答