我使用以下方法运行连续线程:
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,因此不应该生成新的。我做错了什么?
答案 0 :(得分:3)
处理程序中的run函数调用createAndStartCountDownThread(),它创建一个新线程并在其上调用start。因此每个线程都会向处理程序发布一些内容,这将创建一个新线程。所以是的,这个函数会产生很多线程。
我不确定你要做什么,但这是错误的方式。如果需要定时器,请使用定时器或闹钟。如果要创建连续线程,则需要一个带有循环的线程(因此线程不会退出运行并提前终止)。如果你想稍后被唤醒(后来很快就会被唤醒),只需使用一个处理程序。
编辑:
如果您正在尝试实现闪烁行为,我建议使用单个处理程序,并通过postMessageDelayed向其发布消息。这将在稍后的指定时间内运行处理程序runnable。没有线程涉及,所有内容都在UI线程上,因此您可以从中更改UI。