嗯......这是背景:
我正在一个使用pocketsphinx 的实验性应用程序中工作。基本上,我正在运行一项运行线程的服务。该线程管理一个 RecognizerTask 对象。它向 RecognizerTask 对象发出信号以开始录制和识别语音,并在 15 秒后向 RecognizerTask 对象发出关闭信号。紧接着,它再次发出信号开始并重复该过程。
遵循管理 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 没有表现出这种行为)。
所以,问题是:什么可能导致这个问题?