我使用goog.Timer
创建了一个new goog.Timer(1)
对象(http://closure-library.googlecode.com/svn/docs/class_goog_Timer.html),通过监听tick事件每毫秒运行一个函数。但是,该功能似乎每100毫秒运行一次。
我假设我的功能需要一段时间才能运行(当然javascript是单线程的),因此需要一段时间才能进入下一轮。因此,我将计时器的间隔设置为100,并且每1/10秒可靠地运行一次。
Google Closure库是否具有更可靠的计时器,只能在间隔时间内精确运行某个函数?如果没有足够的时间在一个周期内运行一个函数,我可以在下次调度tick时取消之前的调用并运行它。
答案 0 :(得分:2)
Nicholas Zakas在他的博客上写了一篇关于 Timer resolution in browsers 的精彩摘要。正如尼古拉斯指出的那样,HTML5 timers specification(截至2012年8月2日)规定setTimeout()
和setInterval()
的最小间隔为4毫秒。
我编写了以下演示应用程序来测试goog.Timer
的最小间隔延迟。
<!doctype html>
<html>
<head>
<title>goog.Timer Test</title>
<script src="../closure-library/closure/goog/base.js"></script>
</head>
<body>
<h1>goog.Timer Test</h1>
<div id="mainContent"></div>
<script>
goog.require('goog.Timer');
</script>
<script>
var tickCount = 0;
var timer = new goog.Timer(1);
var mainDiv = document.querySelector('#mainContent');
/**
* Tick callback.
*/
var tickCounter = function() {
tickCount++;
if (tickCount % 1000 === 0) {
var timeElapsed = goog.now() - startTime;
mainDiv.innerHTML = 'goog.Timer tick events: ' + tickCount +
'<br>actual elapsed milliseconds: ' + timeElapsed +
'<br>milliseconds per goog.Timer tick: ' + timeElapsed/tickCount;
}
};
startTime = goog.now();
timer.start();
goog.events.listen(timer, goog.Timer.TICK, tickCounter);
</script>
</body>
</html>
在Chrome版本21中运行此程序始终显示每goog.Timer
个刻度事件大约4.2毫秒,这非常接近4毫秒允许的最小浏览器计时器分辨率。
答案 1 :(得分:1)
我不知道goog计时器,但这在我的模拟器中起作用。在我告诉它之后,它停止了3毫秒。
public Timer gameTimer;
int i = 1;
TextView TVsource;//You still have to assign this to a layout view in onCreate
public void runTimer() {
gameTimer = new Timer();
gameTimer.schedule(new TimerTask() {
@Override
public void run() {
if (i < 5000) {
TimerMethod();
}
}
}, 1000, 1);
}
public void TimerMethod() {
this.runOnUiThread(Timer_Tick);
}
private Runnable Timer_Tick = new Runnable() {
public void run() {
i++;
TVsource.setText("its " + i);
}
};
P.S。我刚刚意识到这是一个javascript问题,但到底是什么?试试吧。