在日常开发中,我们经常需要计算事件发生之间的时间间隔。比如为了防止用户频繁重复点击某个按钮,我们就需要根据上一次点击的时间和当前点击的时间间隔来判断是否响应点击事件,错误代码如下:

1
2
3
4
5
6
7
8
9
private static final int MIN_RESPONSE_TIME = 300;
private long lastTouchEventTime = System.currentTimeMillis();

if (System.currentTimeMillis() - lastTouchEventTime < MIN_RESPONSE_TIME) {
// TODO don't response
} else {
lastTouchEventTime = System.currentTimeMillis();
// TODO do something what you want
}
  • System.currentTimeMills()得到的是系统当前时间,而系统时间是可以修改的,因此不适合用来计算时间间隔。
  • System.uptimeMillis()得到的是自开机后,经过的时间,不包括深度睡眠的时间
  • System.elapsedRealtime()自开机后,经过的时间,包括深度睡眠的时间,适合用来计算时间间隔

使用System.elapsedRealtime()计算时间间隔的代码如下:

1
2
3
4
5
6
7
8
9
private static final int MIN_RESPONSE_TIME = 300;
private long lastTouchEventTime = SystemClock.elapsedRealtime();

if (SystemClock.elapsedRealtime() - lastTouchEventTime < MIN_RESPONSE_TIME) {
// TODO don't response
} else {
lastTouchEventTime = SystemClock.elapsedRealtime();
// TODO do something what you want
}

参考资料


System.currentTimeMillis() uptimeMillis elapsedRealtime 区别