【发布时间】:2013-12-08 09:33:20
【问题描述】:
由于游戏需要 TTS,并且需要很长时间才能加载,所以我想通过以下方式任一实现进度对话框 (PD):
在游戏索引页面中实现 AsyncTask:
这会显示PD,但是PD被冻结了,即PD内部的循环圈没有循环。
buttonC.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
new initialize_game().execute();
}
});
private class initialize_game extends AsyncTask<String,Integer,String>
{
@Override
protected void onPreExecute()
{
dialog= new ProgressDialog(Index_game.this);
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.setMessage("Loading!\nPlease wait...");
dialog.show();
}
@Override
protected String doInBackground(String... params)
{
buttonC.setBackgroundColor(getResources().getColor(R.color.tran_black));
Intent intent = new Intent(Index_game.this, Game_star_intro.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
startActivityForResult(intent, 0);
overridePendingTransition(0, 0); // 0 for no animation
Index_game.this.finish();
return "Done!";
}
protected void onPostExecute(String result)
{
super.onPostExecute(result);
Log.i("result","" +result);
if(result!=null)
{
dialog.dismiss();
}
}
}
TTS 的异步任务:
从游戏索引页面点击后,直到游戏完全加载后才会显示 PD,此时 PD 会弹出并关闭一毫秒,即比上面的更糟。
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);
}
}
}
}
// 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);
}
}
问题:
我发现当按下游戏索引中的按钮 C 时,进度对话框没有显示出来。但是,当Game_star_intro 最终加载时,进度对话框会弹出很短的时间然后就消失了。
我想在加载游戏时显示 ProgressDialog,而不是在加载游戏后对话框弹出一毫秒。
这样,我也试过把负载TTS放在AsyncTask里面Game_star_intro里面,结果还是一样:对话框只弹出一毫秒。
其实AsyncTask应该怎么编码??我关注了这样的网站http://karanbalkar.com/2012/10/tutorial-5-custom-progressdialog-with-asynctask/
感谢您的宝贵时间!
【问题讨论】:
标签: android android-asynctask text-to-speech progressdialog