Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么millisUntilFinished无法检测到精确的倒计时时间间隔?_Android_Text To Speech - Fatal编程技术网

Android 为什么millisUntilFinished无法检测到精确的倒计时时间间隔?

Android 为什么millisUntilFinished无法检测到精确的倒计时时间间隔?,android,text-to-speech,Android,Text To Speech,嘿,大家好,倒计时有一个很小但很烦人的问题。。目前,我将间隔设置为1000。我正在尝试检测我的内存中剩余的毫秒数 onTick() 方法。这样我就可以在还剩20秒、10秒等时使用文本转换语音。如果我使用: //Speak when 20 seconds left if (millisUntilFinished == 20000) { tts.speak("You have 20 seconds left.", TextToSpeech.QUEUE_FLUSH, null); } 计时

嘿,大家好,倒计时有一个很小但很烦人的问题。。目前,我将间隔设置为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);
     } 
}
//还剩20秒时说话
如果(毫秒小于20999){
如果(毫微秒级>19999){
tts.speak(“您还有20秒。”,TextToSpeech.QUEUE\u FLUSH,null);
} 
}
问题是,有时文本到语音转换在这段时间内会出现两次。有没有办法精确检测毫秒数,这样我就不必使用大于或小于

有没有办法精确检测毫秒数,这样我就不必使用大于或小于


当然不是。Android不是RTOS。由于主应用程序线程在任何给定时刻都可能被其他任务占用,因此计时将是近似的。

如果您想要更大的灵活性,您也可以尝试以下方法

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

你可以使用一个技巧。如果使用计时器小部件而不是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--;

        }

    }

});

有点脏,但添加一次布尔值以防止重复说话非常简单。