我正在使用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;
}
}
怎么办?
答案 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毫秒时,你正在做的事情会阻塞线程。