2

我正在開發一個簡單的應用程序,它將在收到呼叫時說出聯繫人姓名或未知號碼。我正在使用broadcastReceiverServices執行應用程序。如果我在emulator上運行應用程序並使用DDMS開始呼叫,並保存2或3個聯繫人,該應用程序正常工作,因爲onInit()tts.speak()運行前被調用。等待TextToSpeech onInit()已初始化

現在,當我嘗試在我的android手機上運行相同的應用程序時,之後調用onInit。從我所瞭解的同時尋找這個問題的答案,這是由於tts.speak()不等待onInit來調用。

我在這個問題上找到的一個解決方案是How to wait for TextToSpeech initialization on Android,但那也不起作用。

這個問題已被問了很多次,但我找不到工作解決方案。這個鏈接建議使用處理程序http://davidcheney.wordpress.com/2010/11/16/multitasking-in-android/,但作爲一個新手,我不知道如何實現。

從我明白我必須等到onInit被稱爲之前我可以使用tts.speak()但我不知道該怎麼做。

更新 我試圖打電話給onInitspeak功能,因爲它是要說出從其他地方來了的數據,我不想做的所有編碼中onInit,這是行不通的。所以我改變了我的代碼,最終設法在onInit()內運行speak()。 雖然代碼現在正在運行,但必須有方法在onInit之外呼叫speak()。所以我會等待更好的答案,否則將面向同樣問題的其他人發佈我的代碼。

+1

說出見我anwser類似的問題在這裏的http://計算器.com/questions/4141567/how-to-wait-for-texttospeech-initialization-on-android – Evaldas

+0

請看看我在這裏發佈的解決方案。 http://stackoverflow.com/a/23786730/447558 – Milton

回答

1

你要麼設置一個類會員標記boolean mTtsInitialized,並檢查你打電話speak這個標誌,每次還是把代碼來獲取數據以onInit

+0

我不想把數據放在onInit()中。我已經使用了布爾標誌的東西。但我應該放什麼樣的條件?如果'(mTtsInitialized == true)'那麼什麼?我應該如何等待'mTtsInitialized'成爲真正的主要問題。 –

+0

如果狀態爲TextToSpeech.SUCCESS,您可以在onInit中設置mTtsInitialized = true。然後,如果(mTtsInitialized){說(...)}; –

+0

我正在使用'(mTtsInitialized){speak(...)};'在完全不同的函數中,即不在'onInit'中,因此它看到'mTtsInitialized'是'false',所以不會調用'speak'。 –

1

這不是處理這個問題的最優雅的方式,我敢肯定,但是您可以擴展包含onInit()方法的類嗎?

在這個類中,你可以有一個布爾變量來有效地「鎖定」你的線程。重寫onInit()方法,調用super(),然後在super()將此值設置爲true後。然後,輸入一個循環來阻塞調用tts.speak()的線程,直到該值爲true。

你會想要記住,你不能在UI線程中這樣做,因爲如果你阻止它太久會導致你的應用程序崩潰。

我希望我能正確理解你的問題。 :)

+0

請提供一個小例子,讓我更好地理解 –