Как получилось, что millisUntilFinished не может определить точные интервалы CountDownTimer? - PullRequest
3 голосов
/ 28 января 2011

Привет всем, поэтому есть небольшая, но раздражающая проблема с 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 ]

3 голосов
/ 28 января 2011

Есть ли способ точно определить миллисекунды, поэтому мне не нужно использовать больше или меньше?

Конечно, нет.Android не является ОСРВ.Сроки будут приблизительными, просто из-за того, что основной поток приложения, возможно, будет занят другими обязанностями в любой данный момент.

2 голосов
/ 27 февраля 2012

Если вы хотите больше гибкости, вы можете попробовать что-то вроде

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 голосов
/ 13 июня 2013

Вы могли бы использовать трюк.Если вы используете виджет Chronometer вместо 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--;

        }

    }

});
...