Прогрессдиалог не исчезает - PullRequest
0 голосов
/ 12 сентября 2011

Мой код пытается сделать это:

  • 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 будет вызываться дважды за цикл.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

Попробуйте написать код для отображения диалога по методу onPrepareDialog (int id, Dialog dialog, Bundle args). Согласно документации для showDialog , вызов onCreateDialog(int, Bundle) будет сделан с тем же идентификатором при первом вызове для данного идентификатора.

0 голосов
/ 12 сентября 2011

Отключить диалог в onDestroy() действия. В противном случае проверьте, отображается ли диалоговое окно перед вызовом show(). Посмотрим, решит ли это проблему.

Обновление

Лучший вариант, который я вижу для ваших простых нужд, это ProgressDialog. Вы пробовали это?

ProgressDialog mProgDialog = ProgressDialog.show(YourActivity.this, "", 
                    "Loading. Please wait...", true);

для увольнения в onPostExecute

mProgDialog.dismiss();

Обновление 2

Я не уверен, сработает ли это. Переопределите onCancelled в ваших Asynctasks и отклоните ваши диалоги прогресса там. Таким образом, когда ориентация меняется и если асинктические задачи отменяются путем вызова отмены, тогда диалоги будут закрыты. Сначала проверьте, вызывается ли onCancelled, когда активность уничтожается во время выполнения asynctask.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...