嗯......这是背景:
我正在使用pocketsphinx的实验性应用程序。基本上,我正在运行一个运行线程的服务。该线程管理RecognizerTask对象。它向RecognizerTask对象发出信号以开始记录和识别语音,15秒后,它向IgnizerTask对象发出关闭信号。之后,它再次发出信号并重复该过程。
遵循管理RecognizerTask对象的线程的代码:
public void run() {
while(!this.interrupted){
try{
Thread.sleep(15000);
}
catch (InterruptedException e){
e.printStackTrace();
return;
}
rec.shutdown();
try {
rec_thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
if(Thread.interrupted())
return;
rec = new RecognizerTask();
rec_thread = new Thread(rec);
System.gc();
rec.setRecognitionListener(MyService.this);
rec_thread.start();
rec.start();
}
}
这里的问题如下:如果设备处于唤醒状态并且屏幕已打开,则一切正常。但是如果屏幕被锁定,则线程会在.join()调用时冻结。进一步检查,我意识到.join()冻结了,因为对ReconizerTask对象中存在的AudioRecord实例的一次调用就不会返回!一旦我解锁手机,一切都运行良好!此外,我的服务在运行时获得了部分唤醒锁。
更糟糕的是:据我所知,这只发生在Galaxy S3设备上(虚拟设备和Galaxy Nexus没有显示此行为)。
所以,问题是:可能导致这个问题的原因是什么?