You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:07:08