android Handler.postAtTime vs Handler.postDelayed

ryevplcw  于 2023-08-01  发布在  Android
关注(0)|答案(4)|浏览(119)

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)


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

uurv41yg

uurv41yg1#

查看源代码后,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;

字符串
然后延迟

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    }

2jcobegt

2jcobegt2#

查看处理程序源,似乎有:

private final Message getPostMessage(Runnable r, Object token) {
    Message m = Message.obtain();
    m.obj = token;
    m.callback = r;
    return m;
}

字符串
你可以复制你想要的:不要调用postDelayed,而是将runnable Package 在这样的消息中

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


然后,您可以使用removeCallbacks()和token作为参数

vfh0ocws

vfh0ocws3#

这是一个老问题,但API28中增加了以token为参数的postDelayed方法版本:请参阅https://developer.android.com/reference/android/os/Handler#postDelayed(java.lang.Runnable,%20java.lang.Object,%20long)
对于较旧的API版本,如果需要令牌来删除回调,仍然必须使用postAtTime

pbgvytdp

pbgvytdp4#

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

相关问题