我正在使用它进行一些信号处理。这一切都很好,除非屏幕熄灭,此时显示器旋转。通常屏幕关闭只会产生一个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(一个易失性变量),然后它等待工作线程停止。
if (thread.isAlive()) {
keepProcessing = false;
thread.join();
}
thread = null;
当另一个线程退出keepProcessing循环时,它会停止录制,释放AudioRecord资源,删除AudioRecord实例并终止。
作为一般启动/停止机制,一切正常。检查断点和adb一切似乎按正确的顺序发生。它只是在这个屏幕旋转场景中不起作用。我只能认为这是因为在旧的Activity中所有内容都停止后,非常快速的新Activity onCreate()等。即AudioRecord中有一些东西仍然很忙。当一个人试图再次打开屏幕时,一切都会冻结。
如果我假设AudioRecord代码没有实际开始录制,那么循环只是坐着睡觉,然后不再停止录制,一切正常。只有在录音机进入录音模式后才会出错。
有什么建议吗?
答案 0 :(得分:2)
旋转设备时,您的活动实际上已停止并被销毁。如果你有后台线程正在工作,这完全搞砸了你。解决此问题的最佳方法是告诉Android不要这样做,方法是将android:configChange="orientation"
添加到该活动的清单中。是的,谷歌做出了糟糕的架构决定,而且我几乎建议在所有活动中加入这个决定。
答案 1 :(得分:0)
是的,我可以看到,我刚刚发现了正在发生的事情,就像那样。
由于初始化keepProcessing标志的错误,有一个竞争条件可能会在Activity停止时让后台线程继续运行。
“如果你有后台线程正在工作[当活动停止时],这完全搞砸了你”
你是对的。确实如此。