2015-08-13 2 views
0

Я работаю над AudioRecord.Android: 2 задачи один за другим с разницей времени

Требование: я должен сгенерировать тон и воспроизвести тон в течение 0,25 секунды. После этого аудиозапись должна автоматически запускаться и продолжаться в течение 10 секунд. Через 10 секунд запись звука должна быть остановлена.

Я написал код для генерации тональности и записи и воспроизведения звука.

Но я не мог выполнить его с требуемым сроком. Я сталкиваюсь с проблемой нити из-за RecordThread: overflow или java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare().

genTone(Constants.HEART_TONE_FREQ); 
playToneInPhone(); 

Thread recordThread = new Thread(new Runnable() { 
    @Override 
    public void run() { 
     isRecording=true; 
     recordingTimer = new RecordingTimer(10000,1000); 
     recordingTimer.start(); 
     startRecording(); 
    } 
}); 
try { 
    recordThread.sleep(250); 
    recordThread.start(); 
} catch(InterruptedException ie) { 

} 

RecordingTimer - это CountDownTimer. Может кто-нибудь помочь мне решить эту проблему?

+0

Попробуйте инициализировать метод записи за пределами метода run(). [...] 'playToneInPhone(); recordTimer = новый RecordingTimer (10000,1000); Рекорд записиThread = new [...] ' –

+0

Нет. Это не может быть правильно. Потому что мне нужно запустить таймер записи только после завершения воспроизведения. Во всяком случае, я исправил проблему. Ниже приведен фрагмент кода. – Geetha

ответ

0

Я исправил вышеупомянутую проблему путем puttin recordingTimer после начала потока. Пожалуйста, дайте мне знать, есть ли другой лучший способ сделать это.

genTone(Constants.HEART_TONE_FREQ); 
    playToneInPhone(); 

    Thread recordThread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      isRecording=true; 

      startRecording(); 
     } 
    }); 
    try { 
     recordThread.sleep(250); 
     recordThread.start(); 
     recordingTimer = new RecordingTimer(10000,1000); 
     recordingTimer.start(); 
    } catch(InterruptedException ie) { 

    } 
0

Почему бы не использовать Handler с функцией postDelayed для этой цели. Он будет работать в основном потоке пользовательского интерфейса, поэтому синхронизация будет принудительной.

Я могу взломать некоторые примеры реализации, если это поможет? :)

+0

Я уже пробовал этот. Проблема в том, что мне приходится записывать запись также. Я не мог использовать обработчик в обработчике. – Geetha

+0

Нет, но вы можете прервать его. Разве это не то, что вы хотите сделать - у вас есть 0,25-секундный таймер и 10-секундный? – Sipty

+0

да .. тон должен быть 0,25, после чего звуковая запись должна быть автоматически запущена и закончена через 10 секунд. – Geetha

0

ScheduledExecutorSrvice следует использовать (с задержкой или по расписанию потоковой передачи) или будущего интерфейса, который извлекает объекты после того, как потоковая передача завершена (результирующие данные будут получены). он отправляется через потоковый объект вместо интерфейса Runnable.

Смежные вопросы