我已经工作了这么长时间,但仍然stucked。 游戏具有TTS,它似乎需要很长的时间来加载(或实际上是用于TTS正确??的代码),所以在考虑到漫长的等待时间(在真实的设备进行测试时约3秒),我会喜欢把进度对话框(PD)。
该PD有一个循环圈。 我的TTS一部分,下面的代码的代码:
的AsyncTask:
private class MainFrameTask extends AsyncTask<String,Integer,String> implements OnInitListener, OnUtteranceCompletedListener
{
private Index_game_card_intro mainFrame = null;
public MainFrameTask(Index_game_card_intro mainFrame)
{
this.mainFrame = mainFrame;
}
@Override
protected void onCancelled()
{
stopProgressDialog();
super.onCancelled();
}
@Override
protected void onPreExecute()
{
startProgressDialog();
}
@Override
protected String doInBackground(String... params)
{
// setup TTS part 1.1
mTts = new TextToSpeech(Index_game_card_intro.this, this); // TextToSpeech.OnInitListener
return "Done!";
}
protected void onPostExecute(String result)
{
stopProgressDialog();
}
// setup TTS part 2
@Override
public void onUtteranceCompleted(String utteranceId)
{
Log.v(TAG, "Get completed message for the utteranceId " + utteranceId);
lastUtterance = Integer.parseInt(utteranceId);
}
// setup TTS part 3
@Override
public void onInit(int status)
{
if(status == TextToSpeech.SUCCESS)
{
int result = mTts.setLanguage(Locale.US); // <====== set speech location
mTts.setSpeechRate((float) 0.8);
mTts.setPitch(1.0f);
if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
{
// button_header.setEnabled(false);
}
else
{
// button_header.setEnabled(true);
mTts.setOnUtteranceCompletedListener(this);
}
}
}
}
外面的AsyncTask:
// setup TTS part 4
private void speakText()
{
lastUtterance++;
if(lastUtterance >= loveArray.length)
{
lastUtterance = 0;
}
Log.v(TAG, "the begin utterance is " + lastUtterance);
for(int i = lastUtterance; i < loveArray.length; i++)
{
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));
mTts.speak(loveArray[i], TextToSpeech.QUEUE_ADD, params);
mTts.playSilence(ttsilience, TextToSpeech.QUEUE_ADD, null);
}
}
public void speak_action(String to_speak)
{
// speaking
// setup TTS part 1.2
StringTokenizer loveTokens = new StringTokenizer(to_speak,",.");
int s = 0;
loveArray = new String[loveTokens.countTokens()];
while(loveTokens.hasMoreTokens())
{
loveArray[s++] = loveTokens.nextToken();
}
speakText();
}
试用:
我试图替换内的代码doInBackground
用Thread.sleep(1000);
。 该PD可与循环圈完美。
题:
该PD显示,但冻结,即。 圆不循环。 我想问一下
是否应该TTS以这种方式进行编码(这实际上并不需要
AsyncTask
?)如果需要
AsyncTask
,如何可以在代码重新安排?
我用Google搜索,但似乎没有人把里面的TTS AsyncTask
。 想听听你的意见......非常感谢!