Android Studio中While循环致音频录制应用卡顿问题求助
问题根源:主线程被阻塞
你的问题很典型——record()方法在主线程里执行了无限循环,直接把UI线程卡死了。Android的主线程负责处理所有UI交互和界面刷新操作,一旦被长时间占用(比如你的while(isRecording)循环),系统就无法响应按钮点击、界面重绘,自然会出现卡顿甚至ANR(应用无响应)。
解决方案:把音频读取放到后台线程
你需要把音频数据的读取逻辑移到后台线程中执行,同时更新UI的时候必须切回主线程(Android不允许在子线程操作UI控件)。下面是具体的修改步骤:
1. 保证线程安全的状态变量
首先给isRecording加上volatile修饰符,确保主线程和后台线程能实时看到变量的最新值:
private volatile boolean isRecording = false;
2. 修改record()方法,使用后台线程
把while循环放到新线程里,更新TextView时用runOnUiThread()切回主线程:
private void record() { new Thread(() -> { int readSize; while (isRecording) { readSize = recorder.read(buffer, 0, buffer.length); // 必须在主线程更新UI runOnUiThread(() -> { txtView.setText(Integer.toString(readSize)); }); } }).start(); }
3. 额外优化(可选)
如果频繁创建线程对你来说不太优雅,可以用ExecutorService来复用线程,避免线程创建的开销:
private ExecutorService executor = Executors.newSingleThreadExecutor(); private void record() { executor.execute(() -> { int readSize; while (isRecording) { readSize = recorder.read(buffer, 0, buffer.length); runOnUiThread(() -> { txtView.setText(Integer.toString(readSize)); }); } }); } // 在onDestroy里记得关闭线程池,避免内存泄漏 @Override public void onDestroy() { recorder.release(); executor.shutdown(); super.onDestroy(); }
为什么之前的单次/反复点击没问题?
因为单次点击时,record()里的循环只执行了几次就被停止了,还没来得及阻塞主线程;但持续循环时,主线程被完全占用,所以立刻出现卡顿。
内容的提问来源于stack exchange,提问作者bagelbomb
相关产品推荐
相关产品推荐

