我正在编写一个与用户说话的活动,我真的想阻止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等显式同步,而且这一切都很快就会变得混乱。
什么是正确的方式 - 或者至少有一种方法可行:) - 这样做?
谢谢!
答案 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();
}
});