首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Handler.postAtTime对Handler.postDelayed

Handler.postAtTime对Handler.postDelayed
EN

Stack Overflow用户
提问于 2013-02-04 15:38:07
回答 4查看 6.8K关注 0票数 6

android 处理程序类包含以下方法:

代码语言:javascript
复制
public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)

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

代码语言:javascript
复制
public final void removeCallbacks (Runnable r, Object token)

以下方法在Handler类中不存在

代码语言:javascript
复制
public final boolean postDelayed (Runnable r, Object token, long delay)

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-02-04 16:08:23

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

代码语言:javascript
复制
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

代码语言:javascript
复制
 public final boolean postDelayed(Runnable r, long delayMillis)
330    {
331        return sendMessageDelayed(getPostMessage(r), delayMillis);
332    }

如果你想要的

代码语言:javascript
复制
public final boolean postDelayed (Runnable r, Object token, long delay)

那为什么不直接用

代码语言:javascript
复制
public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)

因为它是一样的。

更新,忘记添加以下内容:

代码语言:javascript
复制
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    }
票数 5
EN

Stack Overflow用户

发布于 2013-02-04 16:33:08

从Handler源来看,似乎有:

代码语言:javascript
复制
private final Message getPostMessage(Runnable r, Object token) {
    Message m = Message.obtain();
    m.obj = token;
    m.callback = r;
    return m;
}

它可以按您的需要复制:而不是调用postDelayed,而是在这样的消息中包装您的可运行的

代码语言:javascript
复制
sendMessageDelayed(getPostMessage(r, token), delayMillis);

然后,可以使用带有令牌的removeCallbacks()作为param。

票数 2
EN

Stack Overflow用户

发布于 2020-07-22 17:58:40

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14690093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档