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)
有没有充分的理由不提供这样的方法?
答案 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)。为什么需要令牌?