我正在开发一个有2个课程的Android应用程序。游戏,扩展了Activity,GameView,扩展了View。
加载游戏时,它会将内容视图设置为GameView,这只是一个使用画布显示游戏的绘图类。
我正在尝试在Game类中创建一个ProgressDialog,它将在完成某个操作后显示一个微调器,因为这需要很长时间才能完成。到目前为止,我有以下内容:
setContentView(R.layout.activity_game);
ProgressDialog pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pd.setMessage("Calculating hint");
pd.show();
AsyncTask<String[][], Void, SudokuSquare> nextSquareThread = new GetNextSquare().execute(puzzleNumbers);
next = nextSquareThread.get();
pd.dismiss();
setContentView(gameView);
我的AsyncTask类看起来像这样:
private class GetNextSquare extends AsyncTask<String[][], Void, SudokuSquare> {
private ProgressDialog dialog = new ProgressDialog(Game.this);
@Override
protected void onPreExecute() {
this.dialog.setMessage("Finding next number");
this.dialog.show();
}
@Override
protected SudokuSquare doInBackground(final String[][]... args) {
try {
SudokuAdvancedSolver solver = new SudokuSolver(args[0]);
return solver.getOneValue();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void onPostExecute(final SudokuSquare result) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
目前我有两个ProgressDialogs,一个位于AsyncTask内,一个位于外部。哪一个是正确的?此外,根本没有显示微调器。我忽视了什么导致了这种情况?
答案 0 :(得分:0)
只有外面的一个是正确的。因为你正在尝试另一个线程(你的asychronic任务)的主线程(你的活动的UI线程)。你应该用一个处理程序来代替: 1 /你显示进度条 2 /你在一个线程中加载游戏 3 /当游戏加载时,你向处理程序发送一条消息,停止进度条。
见exemple。你应该在处理程序中关闭你的对话框(当处理程序从线程收到消息时)。
答案 1 :(得分:0)
如果你没有在Asynctask上实现一个监听器,我可以建议你在PostExecute上关闭你的进度对话框
private ProgressDialog dialog;
public void setProgressDialog(ProgressDialog dialog){
this.dialog = dialog;
}
@Override
protected void onPostExecute(final SudokuSquare result) {
dialog.dismiss();
}
在执行Asynctask之前添加此代码
nextSquareThread.setProgressDialog(pd);