簡體   English   中英

塊執行變量(TTS 用例),而不是日志語句(幽靈)

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

我希望在執行代碼塊之前讓布爾值為真,並且我希望它實際上阻塞它所在的線程。 用例很簡單。 我在我的應用程序中有一個 TTS 用例,我希望有一個順序執行,其中一個 TTS 說話,然后發生一些事情,它再次說話等等,但問題是這完全是時間敏感的。 我需要在 TTS 完成通話后立即啟動一個計時器,但事實證明speak(...)方法是非阻塞的(顯然),因此在它說話的那一刻,控制轉移到下一行。

為了解決這個問題,我使用了一個使用deprecatedisSpeaking OnUtteranceCompletedListener並且它似乎一如既往地工作得很好。

然而,這是我在我的實現中看到的一個超級奇特的執行。 正如我之前提到的,該變量可以很好地跟蹤語音,但是當我像這樣應用我的循環時,

while(speaking){
  continue
}

它會一直阻塞,直到出現語音,然后控制就消失了!!! ,

我在這個循環之后放了一條日志語句,一旦條件變為假,即循環中斷,它就不會記錄那部分代碼。 事實上,它之后什么都不做。 就好像執行“丟失”了,在那之后的某個地方。 該應用程序甚至不會凍結。 我使用 Jetpack-Compose,因此所有可無限重復的動畫都可以正常工作,但之后該應用程序不會執行任何操作。

但是,事情是這樣的——如果我只用一個Log語句替換我的continue ,它就會神奇地起作用。 一切正常,在添加一個日志聲明后絕對不會出現異常觀察。

我記得我小時候觀察到了這一點,但當時並沒有與溢出社區保持聯系,所以我從來沒有發布過。 之后我再也沒有制作過使用 TTS 的應用程序,所以我無法分享任何東西。

我要說的是,這行得通:

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

這很痛苦,因為我不能在我的生產軟件中使用Log調用,官方文檔嚴格禁止它。 幫助!

您對多線程條件的處理不當,這將是一個問題。 您正在使用的循環正在等待變量在另一個線程上更改。 首先,這僅在變量是 volatile 時才有效。 如果不是,解釋器不知道它需要從內存中重新加載,這個循環將永遠不會結束。 其次,您正在做的事情被稱為忙等待,並且對於電池問題來說是一個壞主意(如果在 UI 線程上完成可能會導致您的應用程序變得無響應甚至被看門狗計時器殺死)。 相反,如果這不是 UI 線程,您應該使用信號量等信號機制。 這將允許您等待,而不會使 CPU 空閑,直到給出信號。 如果這是 UI 線程,則根本不應該這樣做。 相反,您應該讓語音偵聽器將消息發布到 UI 線程的處理程序,並執行循環之后的任何操作以響應該消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM