我在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/

10-11 22:58