块执行一个变量 (TTS Use-Case),而不是日志语句 (spooky)

Block execution over a variable (TTS Use-Case), other than log statements (spooky)

我希望在执行代码块之前让布尔值为真,并且我希望它真正阻塞它所在的线程。 use-case 很简单。我的应用程序中有一个用于 TTS 的 use-case,我希望顺序执行,在 TTS 说话的地方,然后发生一些事情,它再次说话等等,但问题是这完全是 time-sensitive.我需要在 TTS 结束说话后立即启动计时器,但事实证明 speak(...) 方法是 non-blocking(显然),所以在它说话的那一刻,控制转移到下一行。

为了处理这个问题,我得到了一个使用 deprecated OnUtteranceCompletedListener 实现的变量 isSpeaking,它似乎一如既往地工作得很好。

但是,我在实施中看到的是 SUPER-PECULIAR 执行。正如我之前提到的,变量可以很好地跟踪语音,但是当我像这样应用我的循环时,

while(speaking){
  continue
}

它会一直阻塞,直到出现语音,然后 控制才会消失!!!

我在这个循环之后放了一条日志语句,一旦条件变为假,即循环中断,它就不会记录那部分代码。事实上,它之后什么都不做。就好像执行是 "lost",在那之后的某个地方。该应用程序甚至不会冻结。我使用 Jetpack-Compose,所以所有 infinite-repeatable 动画都可以正常工作,但应用程序之后不会执行任何操作。

但是,事情是这样的——如果我只用 Log 语句替换我的 continue,它就会神奇地起作用。一切正常,在添加 ONE 日志声明后绝对没有异常观察。

我记得我是作为 child 观察到这一点的,但当时并没有与 overflow 社区保持联系,所以我从未发布过。之后我再也没有制作过 TTS-using 应用程序,所以我无法分享任何东西。

我的意思是,这有效:

while(speaking){
 Log.i("WHY?", "speaking")
}

这很痛苦,因为我不能在我的生产软件中使用 Log 调用,官方文档严格禁止它。求助!

您对多线程条件处理不当,这将是一个问题。您正在使用的循环正在等待一个变量在另一个线程上发生变化。首先,只有当变量是可变的时才有效。如果不是,解释器不知道它需要从内存中重新加载,并且这个循环将永远不会结束。其次,您正在做的事情称为忙等待,对于电池问题来说是个坏主意(如果在 UI 线程上完成可能会导致您的应用程序变得无响应,甚至被看门狗计时器杀死)。相反,如果这不是 UI 线程,您应该使用像信号量这样的信号机制。这将允许您等待,而不会使 CPU 闲置,直到给出信号。如果这是 UI 线程,则根本不应该这样做。相反,您应该让语音侦听器 post 向 UI 线程的处理程序发送一条消息,并执行循环之后的任何操作以响应该消息。