Java Android postDelayed可以工作,但无法将其放入循环中?
对不起,我是一个noob我读过无数关于制作简单计时器的教程,我想知道为什么它不工作,直到我注意到是while循环导致了问题o。o我已经删除了它,然后它工作了,但只有1次我需要使用循环,所以运动结束:C 代码如下: old_x是ImageView中的坐标,new_x是onTouch事件中的坐标,可能是因为我将它们转换为int?我不知道我需要做什么才能工作请帮助O:Java Android postDelayed可以工作,但无法将其放入循环中?,java,android,casting,while-loop,postdelayed,Java,Android,Casting,While Loop,Postdelayed,对不起,我是一个noob我读过无数关于制作简单计时器的教程,我想知道为什么它不工作,直到我注意到是while循环导致了问题o。o我已经删除了它,然后它工作了,但只有1次我需要使用循环,所以运动结束:C 代码如下: old_x是ImageView中的坐标,new_x是onTouch事件中的坐标,可能是因为我将它们转换为int?我不知道我需要做什么才能工作请帮助O: while(old_x != new_x) { timedMoveIV(100); o
while(old_x != new_x)
{
timedMoveIV(100);
old_x = (int)img.getX();
}
它调用这个方法,如果我在没有循环的情况下执行它,这个方法就可以工作
public void timedMoveIV(int time_ms)
{
//sleep for time_ms milliseconds
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
if(new_x > img.getX())
{
img.setX(img.getX() + 1);
}
else
{
img.setX(img.getX() - 1);
}
}
}, time_ms);
}
你的主要问题是你的循环没有中断,所以它一直在运行这个函数,发布了无数的可运行项 您要做的是在另一个100毫秒后进行runnable调用。请看以下示例:
if(old_x != new_x)
timedMoveIV(100);
在这里,只需调用函数一次。之后,让发布的runnable决定是否需要再次移动:
public void timedMoveIV(final int time_ms)
{
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run()
{
if(new_x > img.getX())
img.setX(img.getX() + 1);
else
img.setX(img.getX() - 1);
// if not in position, call again
if((int)img.getX() != new_x)
timedMoveIV(time_ms);
}
}, time_ms);
}
它应该在img.getX==new_x时停止。但是请注意转换为int,因为如果不使用它,当它位于目标像素范围内时,可能会出现一些振荡
这假设new_x是一个int。如果它也是一个float,您应该将两者转换为int进行比较,或者将它们与最小阈值进行比较。例如,如果差异小于0.5,则将其视为已完成。您的主要问题是循环没有中断,因此它不断运行函数,发布了大量可运行项 您要做的是在另一个100毫秒后进行runnable调用。请看以下示例:
if(old_x != new_x)
timedMoveIV(100);
在这里,只需调用函数一次。之后,让发布的runnable决定是否需要再次移动:
public void timedMoveIV(final int time_ms)
{
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run()
{
if(new_x > img.getX())
img.setX(img.getX() + 1);
else
img.setX(img.getX() - 1);
// if not in position, call again
if((int)img.getX() != new_x)
timedMoveIV(time_ms);
}
}, time_ms);
}
它应该在img.getX==new_x时停止。但是请注意转换为int,因为如果不使用它,当它位于目标像素范围内时,可能会出现一些振荡
这假设new_x是一个int。如果它也是一个float,您应该将两者转换为int进行比较,或者将它们与最小阈值进行比较。例如,如果差异小于0.5,则将其视为已完成。完美!我真是太感谢你了,尽管这件事很简单,但你已经坐了好几个小时了!我还有一个小问题要问。我必须让时间成为一个最终的整数而不是整数,否则它不会接受它。除了生成一个公共变量之外,还有其他方法可以避免这种情况吗?好吧,如果你打算使用一个常量延迟,你最好将它设置为final。我甚至建议在那个时候和最后一个静态成员一起去。这比让神奇的数字四处飘浮要好。太好了!我真是太感谢你了,尽管这件事很简单,但你已经坐了好几个小时了!我还有一个小问题要问。我必须让时间成为一个最终的整数而不是整数,否则它不会接受它。除了生成一个公共变量之外,还有其他方法可以避免这种情况吗?好吧,如果你打算使用一个常量延迟,你最好将它设置为final。我甚至建议在那个时候和最后一个静态成员一起去。这比让神奇的数字四处飘荡要好。