等到TextToSpeech onInit()已初始化

时间:2013-07-16 14:12:06

标签: android multithreading android-asynctask android-service text-to-speech

我正在开发一个简单的应用程序,它会在收到来电时说出联系人姓名或未知号码。我正在使用broadcastReceiverServices来实施该应用。如果我在emulator上运行应用并使用DDMS开始通话,并保存了2或3个联系人,那么应用程序正常运行,因为在onInit()运行之前调用tts.speak()。< / p>

现在,当我尝试在我的Android手机上运行相同的应用时,onInit之后会调用tts.speak()。根据我在搜索此问题的答案时所理解的情况,这是因为tts.speak()没有等待onInit被调用。

我在这个问题上找到的一个解决方案是How to wait for TextToSpeech initialization on Android,但这也没有用。

这个问题已被问过很多次,但我找不到一个有效的解决方案。这个链接建议使用处理程序http://davidcheney.wordpress.com/2010/11/16/multitasking-in-android/,但作为一个新手,我不知道如何实现它。

根据我的理解,我必须等到onInit被调用才能使用tts.speak(),但我不知道该怎么做。

更新 我试图在speak之外调用onInit函数,因为要说的数据来自其他地方而且我不想在onInit中进行所有编码,这是不工作所以我改变了我的代码,最后以某种方式设法在speak()内运行onInit()。 虽然代码现在正在运行,但必须有办法在speak()之外调用onInit。所以我会等待更好的答案,否则我的代码会发布给面临同样问题的其他人。

2 个答案:

答案 0 :(得分:1)

这不是最优雅的处理方式,我敢肯定,但你可以扩展包含onInit()方法的类吗?

在这个类中,你可以有一个布尔变量来有效地“锁定”你的线程。重写onInit()方法,调用super(),然后在super()之后将此值设置为true。然后,输入一个循环来阻塞调用tts.speak()的线程,直到该值为真。

您需要记住,您无法在UI线程中执行此操作,因为如果您将其阻止太久会导致应用程序崩溃。

我希望我能正确理解你的问题。 :)

答案 1 :(得分:1)

您可以设置一个班级成员标志boolean mTtsInitialized,并在每次拨打speak时检查此标记,或者输入代码以便在onInit中说出数据

相关问题