我在android上遇到了一个新的onInit(..)
实例的TextToSpeech
意外问题。
我找到的所有代码示例都假设在调用onOnit(..)
之前将新实例返回给调用方,因此返回值可用于访问新的TextToSpeech
实例。
更改手机的默认语言后,我的活动将重新启动(如预期),并像往常一样创建一个新的TextToSpeech
实例。但在这种情况下,在newonInit(..)
返回实例之前调用TextToSpeech(..)
回调。onInit(..)
中的任何设置都使用过时的实例或null
。
public static void startTTS()
{
tts_enabled = false;
texttospeech = null;
texttospeech = new TextToSpeech(starter/*context*/,new TextToSpeech.OnInitListener()
{
public void onInit(int status)
{
if(texttospeech==null) throw new RuntimeException("startTTS.onInit: texttospeech=null");
boolean r = status==TextToSpeech.SUCCESS;
if(r) { init_tts(); tts_enabled = true; }
else texttospeech = null;
}
});
}
基本上,在这个例子中,exption抛出。
我已经在华为u8510 android 2.3.3和android2.1的模拟器上测试过了。
我应该在这里做什么?
最佳答案
我已经解决了这个问题,它表明,原因与假设的完全不同。我的init代码被执行了两次,创建了两个texttospeech实例,两个onInit()
被交错。
两次调用init代码的原因有些出乎意料:
我已经为这个活动设置了属性android:launchMode="singleTask"
,文档上说,如果活动已经在运行,那么我得到的是onNewIntent()
而不是onCreate()
。我假设,而且似乎是真的,我得到了onNewIntent()
而不是onCreate()
,但在一些罕见的情况下,例如,在用户更改时区之后,我得到了onNewIntent()
之后以及之后的onCreate()
。我不相信这种行为是故意的。
关于android - 设置新语言后:在返回新的TextToSpeech(..)实例之前,将调用TextToSpeech.onInitListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8970950/