2013-07-04 135 views
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,因此不應生成新的countDownThread。我究竟做錯了什麼?

+0

檢查你的條件,你secondsUntilFinished和isCountdownThreadRunning成員。在某些時候,這些條件可能會被評估爲錯誤或真實,這就是爲什麼其他語句會一遍又一遍地被踢掉的原因。 –

+0

那麼你每次調用方法時都要實例化它。使其靜態。 – SceLus

回答

3

您在處理函數中的運行函數調用createAndStartCountDownThread(),它創建一個新線程並調用它的開始。所以每個線程都會向處理程序發佈一些東西,這會創建一個新的線程。所以是的,這個函數會產生大量的線程。

我不確定你想要做什麼,但這是錯誤的方法。如果您想要定時器,請使用定時器或鬧鐘。如果你想創建一個連續的線程,你需要一個帶有循環的線程(所以線程不會退出運行並提前終止)。如果你想稍後被喚醒(後來很快就會很快),只需使用Handler即可。

編輯:

如果你想實現閃爍的行爲,我只是使用通過postMessageDelayed張貼到其消息的單個處理程序建議。這將在稍後指定的時間內運行可運行的處理程序。不涉及任何線程,所有內容都在UI線程上,因此您可以從中更改UI。

相關問題