下面我有一个 Runnable“更新程序”...和一个使用 Handler.PostDelayed 函数在延迟后运行 runnable 的 OnClick 函数...
经过一些编辑,这里去掉无用部分的功能是: (passtog = 切换按钮)
final Runnable updater = new Runnable() {
@Override
public void run() {
if (passTog.isChecked()) {
now = System.currentTimeMillis();
time = now - init;
if (time > 5000) {
Toast.makeText(getApplicationContext(), "WAKE UP !",
Toast.LENGTH_SHORT).show();
}
handler.postDelayed(this, 25);
}
}
};
passTog.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
init = System.currentTimeMillis();
flag = true;
handler.postDelayed(updater,
(new Random().nextInt(4000) + 3000));
}
});
}
解释 基本上,用户切换切换按钮。现在开始了:runnable 可以完全运行(一切都在 if block 中)。 如果用户没有再次按下按钮并将其关闭该应用程序发送一个 Toast“Wake Up!” ..它每 25 毫秒运行并检查一次以更新时间...
非常简单......但我遇到了问题。
在程序真正进入可运行状态之前,我绝对需要有至少 3 秒的延迟时间 + 一些随机值……所以它在 3 秒到 7 秒之间变化。它应该在 3-7 之间变化,但事实并非如此。
当我运行它时:问题 我注意到第一次效果很好……我得到至少 3 秒的延迟 + 随机值 = 完美
第二次,即在开关打开后 ->off-> on :现在它的行为就像没有看到 +3000 ...而只有 ~randInt(4000) 函数...所以它可能会延迟 0 秒或延迟 4 秒...
根据我的所有经验,我从来没有真正遇到过这个问题。我重写了整个代码,我的其他应用程序以完全相同的语法使用此功能并且看起来非常棒。为什么这会创建一个问题 ? Toast 的时间是否可能导致问题..
如何解决? (我对其他方法持开放态度,最好是快速实现。我想要至少 3 秒的延迟,但出于某种原因我没有得到......我需要 UI 响应,但没有线程 hibernate 。)
最佳答案
您可能应该调用 Handler.removeCallbacksAndMessages(null)当开关关闭时。
关于java - Handler.postDelayed 函数不会造成时间延迟? - 安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902526/