2016-03-11 66 views
2

我正在製作一個Android應用程序,可在用戶指定的時間間隔後開啓/關閉閃光燈。除非在第二次調用.cancel()方法之後重新創建Timer對象,否則它每次都會崩潰應用程序。 這裏的初始化部分:如何在取消它之後重新創建Timer類對象?

Timer timer; //variable of Timer class 
TimerTask timerTask; //variable of TimerTask class 

而這裏的方法,該方法被調用時負責按鈕打開閃爍開/關被壓:從上面的代碼

blink.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v){ 
      delay = Integer.valueOf(startDelay.getText().toString()); 
      gap = Integer.valueOf(blinkDelay.getText().toString()); 

      if(!isBlinking) { //isBlinking is a boolean to know whether to stop or re-start timer 
       timer = new Timer(); //I'm creating an object of Timer class every time. 
       isBlinking = true; 
       timer.schedule(timerTask, delay, gap); 

      } 
      else{ 
       isBlinking = false; 
       stoptimertask(); //this will cancel the 'timer' and make it null. 
      } 
     } 
    }); 

在「stoptimertask()」方法有:

public void stoptimertask() { 
    //stop the timer, if it's not already null 

    if (timer != null) { 
     timer.cancel(); 
     timer = null; 
    } 

} 

我從下面顯示的方法設置TimerTask類的'timertask'變量。這就是所謂的主要活動的onCreate()方法:

public void initializeTimerTask() { 

    timerTask = new TimerTask() { //This is passed as the first argument to the timer.schedule() method 
     public void run() {//Basically turns on/off flash. Works well. 
      if(!state) { 
       turnOnFlash(); 
       state = true; 

      } 
      else { 
       turnOffFlash(); 
       state = false; 
      } 

     } 
    }; 

我的問題是,爲什麼當我按下按鈕閃爍第三次該應用是否會崩潰?

  • 第一次按下時,isBlinking爲false,因此if塊執行創建Timer類的新對象並啓動計時器。
  • 第二次按下時,會調用stoptimertask()來取消定時器並將timer變量設置爲null。
  • 當第三次再次按下延遲和間隔的不同值時,應該創建一個Timer類的新對象,但應用程序意外崩潰,並顯示「不幸的是應用程序已停止」錯誤。 我哪裏錯了?

回答

1

您將不得不清除以及。

timer.cancel(); 
timer.purge(); 
1

cancel後,不要忘了purge

您的代碼必須爲stoptimertask()方法。

public void stoptimertask() { 
    //stop the timer, if it's not already null 
    if (timer != null) { 
     timer.cancel(); 
     timer.purge(); 
     timer = null; 
    } 
} 

相關鏈接:

  1. Android timer? How-to?
  2. How to set a timer in android

UPDATE:

由於定時器創建一個新線程,可能考慮重

,如果你需要的是得到的是一個回調,而活動正在運行處理器可以結合使用此鏈接 How to set a timer in android

+0

只是嘗試添加'timer.purge() '但應用程序仍像以前一樣崩潰。 –

+0

@e_cobra在這種情況下,您可以使用scheduleAtFixedRate http:// stackoverflow。com/questions/1877417 /如何設置定時器在android/10101190#10101190 – SkyWalker

+0

@e_cobra我已更新我的答案。請檢查 – SkyWalker

相關問題