Мой код пытается сделать это:
- onCreate он создает и экземпляр асинхронной задачи A
- onPreExecute из A мы делаем вызов: showDialog
- в doInBackgroundмы спим какое-то время SystemClock.sleep (1000)
- onPostExecute закрываем диалог, затем запускаем новую асинхронную задачу B
- Задача B выполняет в основном то же самое, открывая диалоговое окно, ожидая и закрывая его.
Теперь, когда вы впервые открываете приложение, все происходит следующим образом: вы видите два диалоговых окна Progress, всплывающих одно за другим, каждое на определенный период времени.
Однако, если яПоверните экран в любое время, в следующий раз, когда будет создано задание, будут созданы диалоговые окна прогресса, но они никогда не будут отклонены .что делает невозможным использование пользовательского интерфейса.Если я снова поворачиваю экран, я получаю сообщение об ошибке о просочившихся видах (пропадающие диалоговые окна исчезают).плюс новые диалоги теперь создаются и тоже не хотят уходить (быть уволенными).
вот мой код:
public class MainActivity extends ListActivity {
private static final int REFRESH_DIALOG = 100;
private Resources resources;
@Override
protected void onCreate(Bundle savedInstanceState) {
resources = getResources();
setContentView(R.layout.listview);
new CreationWork(this).execute();
super.onCreate(savedInstanceState);
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case REFRESH_DIALOG:
String message = resources.getString(R.string.refreshing);
ProgressDialog refreshDialog = new ProgressDialog(this);
refreshDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
refreshDialog.setMessage(message + "...");
refreshDialog.setCancelable(false);
return refreshDialog;
default:
return null;
}
}
private static class CreationWork extends AsyncTask<Void, Void, DatabaseManager> {
private MainActivity activity;
public CreationWork(MainActivity activity) {
this.activity = activity;
}
@Override
protected void onPreExecute() {
activity.showDialog(MainActivity.REFRESH_DIALOG);
super.onPreExecute();
}
@Override
protected DatabaseManager doInBackground(Void... params) {
SystemClock.sleep(10000);
return null;
}
@Override
protected void onPostExecute(DatabaseManager result) {
activity.dismissDialog(MainActivity.REFRESH_DIALOG);
new RefreshWork(activity).execute();
super.onPostExecute(result);
}
}
static class RefreshWork extends AsyncTask<Void, Void, Cursor> {
private MainActivity activity;
public RefreshWork(MainActivity activity) {
this.activity = activity;
}
@Override
protected void onPreExecute() {
activity.showDialog(MainActivity.REFRESH_DIALOG);
super.onPreExecute();
}
@Override
protected Cursor doInBackground(Void... params) {
SystemClock.sleep(1000);
return null;
}
@Override
protected void onPostExecute(Cursor result) {
activity.dismissDialog(MainActivity.REFRESH_DIALOG);
super.onPostExecute(result);
}
}
}
Некоторая отладочная информация:
Нет ошибок до второго поворота.что имеет смысл, если между первым и вторым поворотами не пропущены диалоговые окна прогресса, они фактически просочились.
при первом запуске приложения, несмотря на два вызова showDialog, onCreateDialog вызывается только один раз (я считаю,это нормальное поведение).однако после первого поворота и для любого последующего поворота onCreateDalog будет вызываться дважды за цикл.