1

我正在使用它进行一些信号处理。一切正常,除非屏幕关闭并且当时显示器旋转了。通常屏幕关闭只会产生一个 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 代码进行虚拟化,使其实际上不开始录制,则循环只是坐下来睡觉,然后不再停止录制,一切都可以。只有当录音机进入录音模式时才会出错。

有什么建议吗?

4

2 回答 2

2

当您旋转设备时,您的活动实际上已停止并被销毁。如果你有后台线程在工作,这完全会让你崩溃。修复它的最佳方法是告诉 Android 不要这样做,方法是将其添加 android:configChange="orientation"到该活动的清单中。是的,这是谷歌的一个糟糕的架构决定,令人讨厌到我几乎建议为所有活动添加它。

于 2013-02-18T19:11:38.820 回答
0

是的,我可以看到,我刚刚发现正在发生的事情,就是这样。

由于初始化 keepProcessing 标志的错误,当 Activity 停止时,存在可能使后台线程继续运行的竞争条件。

“如果你有后台线程在工作 [当活动停止时],这完全会让你崩溃”

你是对的。确实如此。

于 2013-02-18T20:11:56.957 回答