如何在Android上等待TextToSpeech初始化

4

我正在编写一项与用户交互的活动,我真的很想在TextToSpeech初始化时阻止它 - 否则就超时了。 我该如何让我的线程等待?

我尝试过:

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

随着:

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

但OnInit()从未运行。看来OnInit是在我的线程中执行的(通过向我的活动Looper发送消息?),而该线程处于一个紧密的sleep()循环中。
把我的代码大部分("初始化后"的代码)放在OnInit中似乎是错误的。 将其移入Runnable中,然后start()它,并在其中进行上述睡眠将起作用。但现在我的代码在一个新线程中,需要与UI等显式同步,所有这一切变得非常混乱。
什么是正确的方法-或者至少是可行的方法:)-来做到这一点?
谢谢!

在寻找答案的过程中,我查看了Android Handler源代码以更好地理解它,然后发布了“Android中的多任务处理”在http://davidcheney.wordpress.com/2010/11/16/multitasking-in-android/。希望能对某些人有所帮助。 - DJC
请查看我在这里发布的解决方案。https://dev59.com/0W3Xa4cB1Zd3GeqPiMHt#23786730 - Milton
1
@DJC 博客文章怎么了? - Donal Lafferty
2个回答

1

3
非活动的部分怎么办?我们只能使用"Activity"这个词吗? - Ahmed
服务等都有它们自己的设置方式。 - Heiko Rupp

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();                   
            }
        });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接