AsyncTask onPostExecute не работает в основном потоке? - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть несколько действий в моем приложении, которые попали в веб-сервис. Поскольку я не хочу задерживать основной поток, этот код находится в AsyncTask. Однако я не хочу, чтобы пользователь манипулировал Activity во время вызова веб-службы, поэтому перед выполнением AsyncTask я показываю ProgressDialog, который вращает и блокирует экран. В методе OnPostExecute AsyncTask первое, что я делаю, - это отклонение ProgressDialog.

Это должно помешать пользователю манипулировать Activity без фактической блокировки основного потока.

Однако я несколько раз замечал, что ProgressDialog никогда не отклоняется, и пользователь застревает. AsyncTask завершен, onPostExcute выполнен, но ProgressDialog все еще отображается. ProgressDialog не имеет шансов когда-либо быть уволенным, и пользователь застревает на экране. Их единственный вариант - посетить приложение «Настройки Android» и принудительно остановить мое приложение.

Кто-нибудь знает, почему это происходит? Что я могу сделать, чтобы это исправить?

Соответствующий код:

Вот как я показываю ProgressDialog и запускаю задачу:

mProgress = ProgressDialog.show(this, "", "Syncing...", true);
(new MyAsyncTask()).execute(intUserId);

Это onPostExcute для задачи. Там нет "@Override"

    protected void onPostExecute(Boolean result) {
        if (mProgress != null) {
            mProgress.dismiss();
            mProgress = null;
        }
    }

Ответы [ 3 ]

1 голос
/ 15 сентября 2011

Проверьте это:

  1. Убедитесь, что вы вызвали asynctack.execute() в потоке пользовательского интерфейса.
  2. Используйте @Override для onPostExcute(), чтобы убедиться, что оно правильно определено.
0 голосов
/ 20 сентября 2011

Peter Knego разместил следующую ссылку в комментарии под ОП. Решение CommonsWare, кажется, работает хорошо.

Задняя задача, диалоговое окно, изменение ориентации - есть ли 100% -ное рабочее решение?

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

Может быть, попытаться показать ваш ProgressDialog в методе onPreExecute ()?

protected void onPreExecute() {
    mProgress = ProgressDialog.show(this, "", "Syncing...", true);
}

Сделайте снимок и посмотрите, работает ли он.

...