android 处理程序类包含以下方法:
public final boolean postAtTime (Runnable r, Object token, long uptimeMillis)在给定的时间发布一个可运行的。由于以下方法,稍后可以使用token从消息队列中删除对r的回调:
public final void removeCallbacks (Runnable r, Object token)以下方法在Handler类中不存在
public final boolean postDelayed (Runnable r, Object token, long delay)是否有充分的理由不提供这样的方法?
发布于 2013-02-04 16:08:23
在查看了源代码之后,令牌对象最终传递给消息:
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-04 16:33:08
从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()作为param。
发布于 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。
https://stackoverflow.com/questions/14690093
复制相似问题