2013-05-31 70 views
1

在我的应用程序中,当用户按下按钮MediaRecorder开始录制音频时,它会继续录制50秒并自动停止。我从UI线程启动录音机,但是如何等待50秒而不会冻结该UI.Here是我的代码:Android在UI线程中等待而不会冻结它

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 - 嗯?什么内存泄漏? –