2013-05-31 4 views
1

В моем приложении, когда пользователь нажимает кнопку, MediaRecorder начинает запись звука, затем продолжает запись на 50 секунд и останавливается автоматически. Я запускаю рекордер из потока пользовательского интерфейса, но как ждать 50 секунд без замораживания UI.Here мой код:Android ждет в потоке пользовательского интерфейса без его замораживания

MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
recorder.setOutputFile(path); 
recorder.prepare(); 
recorder.start(); 
Thread.sleep(40000); 
recorder.stop(); 
recorder.reset(); 
recorder.release(); 

Я не знаю много о threads.Please помочь

+1

используйте обработчик или задание таймера. http://stackoverflow.com/questions/16829374/thread-in-android-unfortunately-threadapp-has-stopped/16829414#16829414. Не используйте thread.sleep() проверьте ссылку @ http://developer.android.com/training/articles/perf-anr.html – Raghunandan

+1

Основной момент в том, что вы не ждете в нитке ui. Скорее, вы настроили что-то, чтобы поток ui снова вызывался с другим событием в нужном месте в будущем, чтобы вы могли быстро вернуться из текущего вызова события. –

ответ

0

Для чего-то вроде этого, Android предоставляет некоторые инструменты, так что вам не нужно нитку. Если у вас есть удобный объект View (или если этот код находится в подклассе View), вы можете использовать View.postDelayed(Runnable, long) для планирования Runnable для выполнения после определенной задержки (в миллисекундах).

// need to make recorder final so it can be referenced from anonymous Runnable 
final MediaRecorder recorder = new MediaRecorder(); 
recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 
recorder.setOutputFile(path); 
recorder.prepare(); 
recorder.start(); 
postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     recorder.stop(); 
     recorder.reset(); 
     recorder.release(); 
    } 
}, 40000); 

Если у вас нет под рукой View, просто создать Handler и использовать его postDelayed метод. Он работает одинаково.

+1

И не забывайте про утечки памяти, вызываемые этим кодом;) –

+0

@ MaciejGórski - Huh? Какая утечка памяти? –

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