为什么millisUntilFinished无法检测到精确的CountDownTimer间隔?

时间:2011-01-28 01:54:27

标签: android text-to-speech

嘿所有,所以CountDownTimer有一个相当小但烦人的问题。目前我的间隔设置为1000.我试图检测我的

剩余的毫秒数
onTick()

方法。因此,当剩下20秒,剩下10秒等时,我可以使用文本转语音。等等,如果我使用:

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

计时器无法准确检测到20000毫秒。

所以我不得不求助于:

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

问题在于,有时文本到语音将在该间隔期间出现两次。有没有办法完全检测毫秒,所以我不必使用大于或小于?

3 个答案:

答案 0 :(得分:3)

  

有没有办法完全检测毫秒,所以我不必使用大于或小于?

当然不是。 Android不是RTOS。时间将是近似的,仅仅是因为主应用程序线程可能在任何给定时刻被其他职责占用。

答案 1 :(得分: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

答案 2 :(得分:0)

你可以用一招。如果你使用Chronometer小部件而不是TextView,你可以做出类似的东西:

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--;

        }

    }

});