長時間実行されるタスクを開始するボタンのあるアクティビティがあります。AsyncTaskを使用してタスクを実行し、タスクの進行に応じて更新される確定的なProgressBarを表示します。タスクを最初に実行したときはすべて正常に機能しますが、その後の実行ではダイアログが表示されますが、すでに100%および100/100になっています。アクティビティでonCreateDialogとonPrepareDialogの両方をオーバーライドしています。setProgress(0)を使用するとダイアログがリセットされると思いましたが、これは機能していません。AsyncTaskのonPreExecuteメソッドでshowDialogを使用し、AsyncTaskのonPostExecuteでdismissDialogを使用します。ダイアログをリセットする唯一の方法は、onPostExecuteでremoveDialogを使用することですが、何度か再利用するため、ダイアログを再作成したくありません。関連するコードは以下のとおりです。これはAPIレベル10です。
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case PROGRESS_DIALOG:
progressDialog = new ProgressDialog(ProtoBufSerializationTestActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(true);
progressDialog.setMax(100);
progressDialog.setMessage("Testing...");
return progressDialog;
default:
return null;
}
}
@Override
protected void onPrepareDialog(int id, Dialog dialog) {
super.onPrepareDialog(id, dialog);
switch (id) {
case PROGRESS_DIALOG:
ProgressDialog tmp = (ProgressDialog)dialog;
tmp.setProgress(0);
tmp.setSecondaryProgress(0);
return;
default:
Log.e("test", "Unknown dialog requested");
}
}
private class SerializationTestTask extends AsyncTask<Void, Integer, Long> {
@Override
protected void onPreExecute() {
showDialog(PROGRESS_DIALOG);
}
@Override
protected Long doInBackground(Void... params) {
long accumulator = 0;
int totalSize = 0;
for (int i = 0; i < 10000; i++) {
final long start = System.nanoTime();
//code to be timed
final long end = System.nanoTime();
accumulator += end - start;
if (i % 100 == 0) {
publishProgress(i);
}
}
return accumulator;
}
@Override
protected void onPostExecute(Long aLong) {
dismissDialog(PROGRESS_DIALOG);
results.setText(String.format("Serialized Message 10000 times.\nAverage time to serialize %.3fms", (double) aLong / 1e10));
}
@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.incrementProgressBy(1);
}
編集@Arhimedの提案を受けた後、私は次のコードになりました。それははるかに簡単です。使用できたかもしれDialogFragment
ませんが、この場合は必要ないと思います。
private class SerializationTestTask extends AsyncTask<Void, Integer, Long> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = ProgressDialog.show(ProtoBufSerializationTestActivity.this, "Serialization Test", "Testing...", false);
}
@Override
protected Long doInBackground(Void... params) {
long accumulator = 0;
int totalSize = 0;
for (int i = 0; i < 10000; i++) {
final long start = System.nanoTime();
//code to be timed
final long end = System.nanoTime();
accumulator += end - start;
if (i % 100 == 0) {
publishProgress(i);
}
}
return accumulator;
}
@Override
protected void onPostExecute(Long aLong) {
dialog.dismiss();
results.setText(String.format("Serialized Message 10000 times.\nAverage time to serialize %.3fms", (double) aLong / 1e10));
}
@Override
protected void onProgressUpdate(Integer... values) {
dialog.incrementProgressBy(1);
}
}