0

嗯......这是背景:

我正在一个使用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 没有表现出这种行为)。

所以,问题是:什么可能导致这个问题?

4

0 回答 0