我正在使用它进行一些信号处理。一切正常,除非屏幕关闭并且当时显示器旋转了。通常屏幕关闭只会产生一个 Activity onPause(),但是当屏幕旋转时它会运行:onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()、onPause()。也就是说,Android 似乎首先“取消旋转”屏幕。
不幸的是,这似乎使 AudioRecord 以某种未知方式崩溃或冻结。
我所有操作的基本方式是在 onResume() 中启动一个新线程,这会实例化一个 AudioRecord 实例,设置它,开始录制,然后处于循环中:
keepProcessing = true;
while (keepProcessing)
// read a block of data and process
在 UI 线程中的 onPause() 中,keepProcessing(一个 volatile 变量)被清除,然后等待工作线程停止。
if (thread.isAlive()) {
keepProcessing = false;
thread.join();
}
thread = null;
当另一个线程退出 keepProcessing 循环时,它会停止录制,释放 AudioRecord 资源,删除 AudioRecord 实例并终止。
作为一般的启动/停止机制,这一切都很好。检查断点和 adb 一切似乎都以正确的顺序发生。它只是在这个屏幕旋转场景中不起作用。我只能认为这是因为在旧 Activity 中的一切都停止之后非常快速的新 Activity onCreate() 等。即AudioRecord 中有一些东西仍然很忙。当人们试图再次打开屏幕时,会发生什么事情都冻结了。
如果我对 AudioRecord 代码进行虚拟化,使其实际上不开始录制,则循环只是坐下来睡觉,然后不再停止录制,一切都可以。只有当录音机进入录音模式时才会出错。
有什么建议吗?