如何在Android上等待TextToSpeech初始化

时间:2010-11-10 05:43:09

标签: android text-to-speech

我正在编写一个与用户说话的活动,我真的想阻止TextToSpeech初始化 - 或者超时。我怎样才能让我的线程等待?

我试过了:

 while (! mIsTtsReady || i>limit) try { Thread.sleep(100); i++; ... };

以及:

 @Override
 public void OnInit() { mIsTtsReady = true; }   // TextToSpeech.OnInitListener

但是OnInit()永远不会运行。似乎OnInit在我的线程中执行(通过一条消息到我的活动Looper?),这是一个紧密的sleep()循环。

将我的大部分代码(“后init”内容)放入OnInit本身似乎是错误的。 将它移动到Runnable中,然后启动()它,并在该runnable中运行如上所述。但现在我的代码在一个新的线程中,需要与UI等显式同步,而且这一切都很快就会变得混乱。

什么是正确的方式 - 或者至少有一种方法可行:) - 这样做?

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要在例如初始化TTS系统活动onCreate()方法,以便您可以在以后用户使用它时,例如点击一个按钮。

参见例如https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/OneTweetActivity.java#L62调用setupspeak(),然后调用()https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/OneTweetActivity.java#L344),然后在用户点击“发言”按钮时调用。

答案 1 :(得分:0)

public void init(final Context context, final OnProgressStart onStart) {
    _mTts = new TextToSpeech(context, new OnInitListener() {
        // Implements TextToSpeech.OnInitListener.
        public void onInit(int status) {
            // status can be either TextToSpeech.SUCCESS or TextToSpeech.ERROR.
            if (status == TextToSpeech.SUCCESS) {
                _isInitialized = true;
                Services.getTTSS().setLanguage();
                LogUtil.logInfo("TTS connected", this);
                if(onStart != null)
                    onStart.onStart();
            } else {
                // Initialization failed.
                Log.e(Constants.LOGTAG, this.getClass().getName()
                        + " Could not initialize TextToSpeech.");
            }
        }
    });

我也使用了线程睡眠,但似乎它不再起作用了,实际上有更好的方法处理它。只需使用简单的界面传递回调,例如:

    init(context, new OnProgressStart() {               
            public void onStart(String... args) {
                startSpeak();                   
            }
        });