Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 安卓定时器速度增加_Java_Android_Thread Sleep - Fatal编程技术网

Java 安卓定时器速度增加

Java 安卓定时器速度增加,java,android,thread-sleep,Java,Android,Thread Sleep,我对安卓系统很陌生,我在定时器方面有点问题。最初它工作正常,但每次我单击按钮重新启动它,速度都会增加。所以在一段时间内,它开始迅速发展 有人能告诉我如何预防这种情况吗: if (game_start==false) { game_start=true; textfield=(TextView)findViewById(R.id.TVTimer); handler=new Handler(); Runnable runnable = new Runnable ()

我对安卓系统很陌生,我在定时器方面有点问题。最初它工作正常,但每次我单击按钮重新启动它,速度都会增加。所以在一段时间内,它开始迅速发展

有人能告诉我如何预防这种情况吗:

if (game_start==false) {
    game_start=true;

    textfield=(TextView)findViewById(R.id.TVTimer);
    handler=new Handler();
    Runnable runnable = new Runnable () {

        @Override
        public void run(){
            while(Running){
                try{
                    Thread.sleep(1000);
                } catch(InterruptedException e){
                    e.printStackTrace();
                }
                handler.post(new Runnable(){

                    @Override
                    public void run(){
                        number=number+1;
                        time_done=number-prev_time;
                        System.out.println("timer" + time_done);
                        // textfield.setText(String.valueOf(number));
                    }
                });

            }
        }
    };
    new Thread(runnable).start();
}           

实际上,onClick线程的一个新实例启动并使用number&prev\u time变量,该变量超出了线程的范围。要防止出现这种情况,只需在单击按钮时重置numberprev\u time变量的值。

查看java.util.Timer.scheduleAtFixedRate()

是否先取消了原始的
可运行的
?您应该在启动计时器之前或启动计时器时,使用属性存储对
可运行
的引用,并调用
Handler.removeCallbacks(yourHandlerHere)


另外,我建议您只使用
处理程序
可运行
作为计时器,而不是
线程
(除非您确实必须这样做)。

当您单击按钮时,是否再次初始化
数字
值?是,我每次尝试在开始时设置number=0,但它的作用是:如果上一个游戏是1,2,3,4…现在在新游戏中,它开始时是1,5,2,6..重新启动时,你会杀死任何以前的线程,还是会有更多的线程每秒更新一次相同的值?另外,对于这样的延迟,只考虑代码> >后延迟()/代码>而不是单独的线程。我不确定你是什么意思。有没有可能我每次都杀掉线程,然后开始一个新的线程?我同意@laalto的说法。在启动新线程之前,必须中断线程。在对象中保留线程,然后在启动新线程之前杀死旧线程。已尝试初始化为0,但没有解决问题。这甚至无法解决问题。