Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Handler.PostAttribute与Handler.postDelayed_Java_Android - Fatal编程技术网

Java Handler.PostAttribute与Handler.postDelayed

Java Handler.PostAttribute与Handler.postDelayed,java,android,Java,Android,android类包含以下方法: public final boolean postAtTime (Runnable r, Object token, long uptimeMillis) 在给定时间发布Runnable。由于此方法,以后可以使用令牌从消息队列中删除对r的回调: public final void removeCallbacks (Runnable r, Object token) 处理程序类中不存在以下方法 public final boolean postDelayed (

android类包含以下方法:

public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)
在给定时间发布Runnable。由于此方法,以后可以使用
令牌
从消息队列中删除对
r
的回调:

public final void removeCallbacks (Runnable r, Object token)
处理程序类中不存在以下方法

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

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

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

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

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    }
public final boolean sendMessageDelayed(消息消息消息,长延迟毫秒)
442    {
443如果(延迟毫秒<0){
444延迟毫秒=0;
445        }
446返回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
,而是将您的runnable包装在这样的消息中

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

然后,您可以使用
removeCallbacks()
将令牌作为参数这是一个老问题,但是在API28中添加了将令牌作为参数的
postdayed
方法版本:请参阅


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

您缺少什么?标记?是的,标记和移除回叫到使用postDelayedYou发布的内容的功能始终可以使用Runnable调用
Handler.removeCallbacks()
。如果你问我的话,效果很好。这是个好问题。我觉得奇怪的是,什么“令牌”的文档应该不是要删除的可运行程序的标识符。据我所知,令牌只允许您选择一些对r的回调(如果可运行程序被多次发布)好的,我明白了,如果您真的需要这个带有postDelayed runnable的令牌,您可以扩展处理程序类以添加令牌属性,并使用此令牌创建自己的postDelayed方法:/ok。。。因此,似乎没有充分的理由不在APIYes中使用
postDelayed(Runnable r,Object token,long delay)
,但您可以随时向Android组推荐它。从它的外观来看,token对象是Handler类中事后想到的,因此该类有些不完整。@ben75几年后:但它要求您处理消息,这是我很少做的事情,因为这意味着我不能立即使用处理程序。是的,您可以。消息确实会到达Handler.handleMessage,但默认实现是运行message.callback。如果查看Handler.post(Runnable)的代码,它会以与我发布的相同的方式创建一条消息