我希望在執行代碼塊之前讓布林值為真,并且我希望它實際上阻塞它所在的執行緒。用例很簡單。我在我的應用程式中有一個 TTS 用例,我希望有一個順序執行,其中一個 TTS 說話,然后發生一些事情,它再次說話等等,但問題是這完全是時間敏感的。我需要在 TTS 完成通話后立即啟動計時器,但事實證明該speak(...)方法是非阻塞的(顯然),因此在它說話的那一刻,控制轉移到下一行。
為了處理這個問題,我得到了一個isSpeaking使用 , 實作的變數deprecated OnUtteranceCompletedListener,而且它似乎作業得很好,一如既往。
然而,這是我在我的實作中看到的一個超級奇特的執行。正如我之前提到的,該變數可以很好地跟蹤語音,但是當我像這樣應用我的回圈時,
while(speaking){
continue
}
它會一直阻塞,直到出現語音,然后控制就消失了!!!,
我在這個回圈之后放了一條日志陳述句,一旦條件變為假,即回圈中斷,它就不會記錄那部分代碼。事實上,它之后什么都不做。就好像執行“丟失”了,在那之后的某個地方。該應用程式甚至不會凍結。我使用 Jetpack-Compose,因此所有可無限重復的影片都可以正常作業,但之后該應用程式不會執行任何操作。
但是,事情是這樣的——如果我continue只用一個Log陳述句替換 my ,它就會神奇地起作用。一切正常,在添加一個日志宣告后絕對不會出現例外觀察。
我記得我小時候觀察到了這一點,但當時并沒有與溢位社區保持聯系,所以我從來沒有發布過。之后我再也沒有制作過使用 TTS 的應用程式,所以我無法分享任何東西。
我要說的是,這行得通:
while(speaking){
Log.i("WHY?", "speaking")
}
這很痛苦,因為我不能Log在我的生產軟體中使用呼叫,官方檔案嚴格禁止它。幫助!
uj5u.com熱心網友回復:
您對多執行緒條件的處理不當,這將是一個問題。您正在使用的回圈正在等待變數在另一個執行緒上更改。首先,這僅在變數是 volatile 時才有效。如果不是,解釋器不知道它需要從記憶體中重新加載,這個回圈將永遠不會結束。其次,您正在做的事情被稱為忙等待,并且對于電池問題來說是一個壞主意(如果在 UI 執行緒上完成可能會導致您的應用程式變得無回應甚至被看門狗計時器殺死)。相反,如果這不是 UI 執行緒,您應該使用信號量等信號機制。這將允許您等待,而不會使 CPU 空閑,直到給出信號。如果這是 UI 執行緒,則根本不應該這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477851.html
