Java 如何暂时暂停循环

Java 如何暂时暂停循环,java,android-studio,Java,Android Studio,我正在做一个应用程序,它总是检测噪音。当它检测到巨大的噪音时,它就会启动一个功能 当功能运行时,我需要暂时暂停检测噪声的环路 我该怎么做 Hares我的代码: private void readAudioBuffer() { try { short[] buffer = new short[bufferSize]; int bufferReadResult; do { bufferReadResult = audi

我正在做一个应用程序,它总是检测噪音。当它检测到巨大的噪音时,它就会启动一个功能

当功能运行时,我需要暂时暂停检测噪声的环路

我该怎么做

Hares我的代码:

private void readAudioBuffer() {

    try {
        short[] buffer = new short[bufferSize];
        int bufferReadResult;
        do {
            bufferReadResult = audio.read(buffer, 0, bufferSize);
            for (int i = 0; i < bufferReadResult; i++){
                if (buffer[i] > lastLevel) {
                    lastLevel = buffer[i];
                }
            }
            // if sound level is over 20000 start voice recognition
            if (lastLevel > 20000){
                lastLevel = 0;
            // Pause this function:
                startVoiceRecognitionActivity();
            }

        } while (bufferReadResult > 0 && audio.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
private void readAudioBuffer(){
试一试{
short[]buffer=新的short[bufferSize];
int缓冲读取结果;
做{
bufferReadResult=audio.read(缓冲区,0,缓冲区大小);
for(int i=0;ilastLevel){
lastLevel=缓冲区[i];
}
}
//如果声级超过20000,则启动语音识别
如果(lastLevel>20000){
lastLevel=0;
//暂停此功能:
startVoiceRecognitionActivity();
}
}while(bufferReadResult>0&&audio.getRecordingState()==AudioRecord.RECORDSTATE\u录制);
}捕获(例外e){
e、 printStackTrace();
}
}
private void readAudioBuffer(){
试一试{
short[]buffer=新的short[bufferSize];
int缓冲读取结果;
做{
while(audio.getRecordingState()==AudioRecord.RECORDSTATE\u录制){
//等待一定时间。如果它处于录制状态,它将进入此循环,然后等待,否则它将继续检查声级。
}
bufferReadResult=audio.read(缓冲区,0,缓冲区大小);
for(int i=0;ilastLevel){
lastLevel=缓冲区[i];
}
}
//如果声级超过20000,则启动语音识别
如果(lastLevel>20000){
lastLevel=0;
startVoiceRecognitionActivity();
}
}而(bufferReadResult>0);
}捕获(例外e){
e、 printStackTrace();
}
}
基本上是添加 睡眠(5000); 成功了

    try {
        short[] buffer = new short[bufferSize];
        int bufferReadResult;
        do {


            bufferReadResult = audio.read(buffer, 0, bufferSize);
            for (int i = 0; i < bufferReadResult; i++){
                if (buffer[i] > lastLevel) {
                    lastLevel = buffer[i];
                }
            }
            // if sound level is over 20000 start voice recognition
            if (lastLevel > 20000){
                lastLevel = 0;
                startVoiceRecognitionActivity();
                Thread.sleep(5000);
            }

        } while (bufferReadResult > 0 && audio.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
试试看{
short[]buffer=新的short[bufferSize];
int缓冲读取结果;
做{
bufferReadResult=audio.read(缓冲区,0,缓冲区大小);
for(int i=0;ilastLevel){
lastLevel=缓冲区[i];
}
}
//如果声级超过20000,则启动语音识别
如果(lastLevel>20000){
lastLevel=0;
startVoiceRecognitionActivity();
睡眠(5000);
}
}while(bufferReadResult>0&&audio.getRecordingState()==AudioRecord.RECORDSTATE\u录制);
}捕获(例外e){
e、 printStackTrace();
}
}

startVoiceRecognitionActivity()是否在另一个线程中运行?我将更新代码,让您看看。遗憾的是,我无法理解,但我认为可能在某个地方,startVoiceRecognitionActivity()等方法之一启动了一个新线程,它在该线程上处理听到的音频,让readAudioBuffer方法不受限制地运行为什么不中断循环并在循环后启动startVoiceRecognitionActivity?我需要在语音识别后继续循环谢谢您的回答,但它不起作用,但我找到了一个解决方案
    try {
        short[] buffer = new short[bufferSize];
        int bufferReadResult;
        do {


            bufferReadResult = audio.read(buffer, 0, bufferSize);
            for (int i = 0; i < bufferReadResult; i++){
                if (buffer[i] > lastLevel) {
                    lastLevel = buffer[i];
                }
            }
            // if sound level is over 20000 start voice recognition
            if (lastLevel > 20000){
                lastLevel = 0;
                startVoiceRecognitionActivity();
                Thread.sleep(5000);
            }

        } while (bufferReadResult > 0 && audio.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);

    } catch (Exception e) {
        e.printStackTrace();
    }
}