У меня проблема с длинным ProgressDialog
в моем приложении.Я хочу установить довольно большую базу данных при первом запуске приложения (преобразованной в текстовый документ, база данных будет чуть менее 200 страниц).Очевидно, что это займет некоторое время, поэтому я хочу показать пользователю ProgressDialog
, пока это происходит.
Я пытаюсь выполнить это с помощью AsyncTask
;Раньше я пытался использовать Thread
, но я увяз в проблемах, связанных с сохранением / восстановлением состояния.
Индикатор выполнения обновляется очень хорошо.Тем не менее, я устанавливаю базу данных в три этапа, и я хотел бы показать эти этапы отдельно, так что у пользователя есть некоторое представление о том, что происходит, и поэтому каждый процентный пункт на панели не занимает много времени.И по какой-то причине, хотя я могу установить прогресс в диалоге, установка сообщения (или заголовка), похоже, ничего не делает.
Вот код для моего подкласса AsyncTask:
public class InstallDbTask extends AsyncTask<Void, Integer, Void>
{
private static final String TAG = "InstallDbTask";
private static final int READ_RULES = 0;
private static final int WRITE_RULES = 1;
private static final int RW_GLOSSARY = 2;
private ProgressDialog dialog;
private Context context;
public InstallDbTask(Context context) { this.context = context; }
protected void onPreExecute()
{
dialog = new ProgressDialog(context);
dialog.setProgressStyle(STYLE_HORIZONTAL);
dialog.setCancelable(false);
dialog.show();
}
protected Void doInBackground(Void... params)
{
... Initialization ...
// Number of actions to perform for progress bar
int totalCount = rules.length;
// Literal increment for each action
int incrementCount = 0;
// Integral percentage: incrementCount / totalCount * 100
int total = 0;
// Read rules from XML
for(int i = 0; i < rules.length; i++)
{
... Parse XML ...
incrementCount++;
total = (int)(((float)incrementCount / totalCount) * 100);
publishProgress(total, READ_RULES);
}
incrementCount = 0;
// Write rules to DB
SQLiteDatabase database = new DbOpenHelper(context).getWritableDatabase();
for(Rule r : rulesList)
{
... Insert ...
incrementCount++;
total = (int)(((float)incrementCount / totalCount) * 100);
publishProgress(total, WRITE_RULES);
}
totalCount = glossaryTerms.length;
incrementCount = 0;
// Write glossary to DB
String term = null;
for(int i = 0; i < glossaryTerms.length; i++)
{
... Insert ...
incrementCount++;
total = (int)(((float)incrementCount / totalCount) * 100);
publishProgress(total, RW_GLOSSARY);
}
database.close();
return null;
}
protected void onProgressUpdate(Integer... progress)
{
dialog.setProgress(progress[0]);
switch (progress[1])
{
case READ_RULES:
dialog.setMessage(context.getString(R.string.load_db1));
break;
case WRITE_RULES:
dialog.setMessage(context.getString(R.string.load_db2));
break;
case RW_GLOSSARY:
dialog.setMessage(context.getString(R.string.load_db3));
break;
}
}
protected void onPostExecute(Void result)
{
dialog.dismiss();
}
}
Случаи в методе onProgressUpdate
достигаются правильно, ProgressDialog
просто не получает сообщение, так сказать.Что-то я делаю не так?