2011-01-28 69 views
3

嘿所有,所以有一個相當小的,但惱人的問題與CountDownTimer。目前我有一個時間間隔設置爲1000,我試圖探測毫秒的留在我的millisUntilFinished如何檢測不到確切的CountDownTimer間隔?

onTick() 

方法的量。

//Speak when 20 seconds left 
if (millisUntilFinished == 20000) { 
    tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null); 
} 

計時器無法精確地檢測20000毫秒:所以,當有還剩20秒,10秒的等那麼,如果我用我可以使用文本到語音。

所以我不得不求助於使用:

//Speak when 20 seconds left 
if (millisUntilFinished < 20999) { 
    if (millisUntilFinished > 19999) { 
     tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null); 
    } 
} 

但問題是,有時文本到語音將在該間隔期間來上兩次。有什麼辦法可以精確地檢測毫秒,所以我不必使用大於或小於?

+0

有點骯髒,但它很簡單,添加一個布爾值,以防止說兩次。 – user432209 2011-01-28 03:58:33

回答

3

是否有任何方法可以精確檢測毫秒,所以我不必使用大於或小於?

當然。 Android不是一個RTOS。計時將是近似的,只是由於主應用程序線程在任何給定時刻可能被其他任務佔用。

2

如果你想要更多的靈活性,你也可以嘗試像

int secondsLeft = 0; 

new CountDownTimer(30000, 100) { 
    public void onTick(long ms) { 
     if (Math.round((float)ms/1000.0f) != secondsLeft) 
     { 
      secondsLeft = Math.floor((float)ms/1000.0f); 
      if (secondsLeft == 20) { 
       tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null); 
      } 
     } 
    } 

    public void onFinish() { 
    } 
}.start(); 

https://stackoverflow.com/a/6811744/1189831

0

你可以使用一個小技巧。如果你使用天文臺小部件而不是TexView,你可以這樣做:

int time = 30; 

Chronometer chrono = (Chronometer) findViewById(R.id.your_chronometer_id); 

chrono.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { 

    @Override 
    public void onChronometerTick(Chronometer chronometer) { 

     chronometer.setText(String.valueOf(_time)); 

     if(_time == 20) tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null); 

     if(_time == 0){ 

      //Time finished, make your stuff 

      chronometer.stop();  

     }else{ 

      _time--; 

     } 

    } 

});