1

我有以下方法用于运行连续线程:

public void createAndStartCountDownThread(){
    final Handler handler = new Handler();


    countDownThread=new Thread(new Runnable() {
        public void run() {
            int timeToBlink = 1000;
            try{Thread.sleep(timeToBlink);}catch (Exception e) {}
            handler.post(new Runnable() {
                public void run() {
                    if(isCountDownThreadRunning==0)
                        return; 
                    if(secondsUntilFinished!=0)
                        secondsUntilFinished--;

                    if(secondsUntilFinished==0)
                        onFinish();
                    else{

                        createAndStartCountDownThread();

                    }
                }
            });

        }
    });

    countDownThread.start();

}

基本上所有这些都是倒计时。但是,问题在于,如果我过于频繁地调用此方法,似乎会创建该线程的多个副本,因为计时器开始以两倍或三倍的速度移动。我不明白为什么会发生这种情况 - 似乎我正在重新分配现有的 countDownThread,所以不应该生成一个新的。我究竟做错了什么?

4

1 回答 1

3

处理程序中的 run 函数调用 createAndStartCountDownThread(),它创建一个新线程并在其上调用 start。所以每个线程都会向处理程序发布一些东西,这将创建一个新线程。所以是的,这个函数会产生很多线程。

我不确定您要做什么,但这是错误的方法。如果您需要计时器,请使用计时器或闹钟。如果要创建一个连续线程,则需要一个带有循环的线程(因此该线程不会退出运行并过早终止)。如果您想稍后被唤醒(并且稍后很快),只需使用处理程序。

编辑:

如果您尝试实现闪烁行为,我建议您只使用一个处理程序,并通过 postMessageDelayed 向其发布消息。这将在稍后的指定时间内运行可运行的处理程序。不涉及线程,一切都在 UI 线程上,因此您可以从中更改 UI。

于 2013-07-04T20:30:41.077 回答