如果在一定时间间隔后重复调用方法,我该怎么办?

时间:2017-06-27 13:36:02

标签: java android time libgdx

我正在使用libgdx和android studio。在这里,我试图在一定的时间间隔(0.5秒)之后调用一个方法(用于创建纹理)。但是当我运行程序时,它显示“没有响应”对话。

private float x=System.currentTimeMillis();

//in update method


public void update(float dt) {

        handleinput();
        while(x<=System.currentTimeMillis()){
            eggs.create();
            //eggs.update(dt);
            x+=500;
         }
}

怎么办?

4 个答案:

答案 0 :(得分:1)

要处理时间,每次调用渲染时都使用一个变量添加增量时间,当此变量优于1.0f表示已经过了一秒时,您的代码将是这样的:

        private float timeSeconds = 0f;
        private float period = 1f;

        public void render() {
            //Execute handleEvent each 1 second
            timeSeconds +=Gdx.graphics.getDeltaTime();
            if(timeSeconds > period){
                timeSeconds-=period;
                handleEvent();
            }

            [...]

        }

        public void handleEvent() {
             [...]
        }

为了保持井井有条,我个人在我的主游戏类上有一个数组,它包含我所有的定时事件,并处理渲染周期中的所有内容。

答案 1 :(得分:0)

您的代码实际上是一场与时间竞争的竞争对手。

循环可能永远不会结束,因为eggs.create()比在循环结束时为x增加500的时间花费更多的时间。

同样使用float代替long并不是一种好习惯。

修改 要进行适当的调度,请使用与Florian S.在其答案中建议类似的最着名的Java方法。

答案 2 :(得分:0)

你的问题是你不应该在这里使用System.currentTimeMillis()

https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#currentTimeMillis()

  

currentTimeMillis

     

返回:当前时间与1970年1月1日午夜之间的差异(以毫秒为单位)

public void update(float dt) { 
    if(dt < 500) {
        int x = 10;
        // let x be some value to increment
        update(dt + x);
    }
    ...
}

此版本不保证半秒钟,但会让您更好地了解如何解决问题。

答案 3 :(得分:0)

如果要循环运行代码,则应使用DoubleAnimation或Android等效代码。当egs.create()花费超过500毫秒时,你正在做的事情会阻塞线程。