1

我正在尝试编写一个方法,该方法将返回自上次调用该方法以来经过的时间量,它看起来像这样:

package JGame.Util;

import java.util.Date;

public class Util{

    protected static Long lastTime = null;

    public static long getLastTime(){
        long time = new Date().getTime();
        if(Util.lastTime == null){
            Util.lastTime = time;
            return 0;
        }
        long ftime = time - Util.lastTime;
        Util.lastTime = time;
        return ftime;
    }
}

然后我在按键事件中调用这样的方法:

long lastTime = Util.getLastTime();
if(lastTime > 1000){
    return;
}
System.out.println(lastTime);

我遇到的问题是,当按下键时它会打印出来lastTime,但它应该每秒打印一次。

这是输出:

122
6
7
13
9
7
10
9
10

在按住键的同时,我期望所有的间隔都非常接近 1 秒。但数字甚至不接近。

4

3 回答 3

5

你的情况搞错了。看这个:

if (lastTime > 1000) {
    return;
}

也就是说,如果该方法最后一次调用是在一秒以前,则不要打印任何内容。因此,如果您快速连续多次调用它,它总是会在第一次之后通过此检查。

我怀疑你认为你想要

if (lastTime < 1000) {
    return;
}

...但这仍然不会真正做你想要的 - 因为现在如果你非常频繁地按下执行该代码,它只会在第一次检查时通过。

如果超过一秒前,您只需要重置“最后打印”时间。

哦,我建议您使用System.nanoTime()而不是new Date().getTime()- 它保证单调增加,并且设计用于测量时间差异而不是“当前”挂壁时间。我也会让这不仅仅是使用静态变量。我会创建一个允许“阈值”的类,并有一个方法来查看该阈值是否已通过,如果是,则重置计时器:

public class TimeRegulator {
    private final long periodMilliseconds;

    private long lastTick = 0L; // 1970 will be long before the current time :)

    public TimeRegulator(long periodMilliseconds) {
        this.periodMilliseconds = periodMilliseconds;
    }

    public boolean checkTime() {
        long now = System.nanoTime();
        long diffNanos = now - lastTick;
        long diffMilliseconds = TimeUnit.NANOSECONDS.toMillis(diffNanos);
        if (diffMilliseconds < periodMilliseconds) {
            return false;
        }
        lastTick = now;
        return true;
    }
}

此外,考虑注入“获取当前时间”的抽象,以使所有这些都可测试......并考虑使用Joda Time而不是内置库:)

于 2012-12-23T22:42:15.540 回答
2

如果最后一次通话距离超过1 秒,您将返回,我认为如果距离不到 1 秒,您应该返回

你的代码永远不会做(除非更正)是打印一个高于 1000 的值。

于 2012-12-23T22:40:39.060 回答
2

你的 if 语句是倒置的:

if(lastTime > 1000){
    return;
}

如果最后一个间隔超过一秒,您将返回,这与您所描述的相反。尝试将其更改为if(lastTime < 1000){

否则我看不出你的代码有什么问题。

于 2012-12-23T22:42:19.683 回答