我正在开发一个简单的应用程序,它会在收到来电时说出联系人姓名或未知号码。我正在使用broadcastReceiver
和Services
来实施该应用。如果我在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
。所以我会等待更好的答案,否则我的代码会发布给面临同样问题的其他人。
答案 0 :(得分:1)
这不是最优雅的处理方式,我敢肯定,但你可以扩展包含onInit()方法的类吗?
在这个类中,你可以有一个布尔变量来有效地“锁定”你的线程。重写onInit()方法,调用super(),然后在super()之后将此值设置为true。然后,输入一个循环来阻塞调用tts.speak()的线程,直到该值为真。
您需要记住,您无法在UI线程中执行此操作,因为如果您将其阻止太久会导致应用程序崩溃。
我希望我能正确理解你的问题。 :)
答案 1 :(得分:1)
您可以设置一个班级成员标志boolean mTtsInitialized
,并在每次拨打speak
时检查此标记,或者输入代码以便在onInit
中说出数据