Java Android postDelayed可以工作,但无法将其放入循环中?

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

对不起,我是一个noob我读过无数关于制作简单计时器的教程,我想知道为什么它不工作,直到我注意到是while循环导致了问题o。o我已经删除了它,然后它工作了,但只有1次我需要使用循环,所以运动结束:C

代码如下:

old_x是ImageView中的坐标,new_x是onTouch事件中的坐标,可能是因为我将它们转换为int?我不知道我需要做什么才能工作请帮助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。我甚至建议在那个时候和最后一个静态成员一起去。这比让神奇的数字四处飘荡要好。