AsyncTask не вызывает onPostExecute () - PullRequest
1 голос
/ 21 марта 2012

Я пишу AsyncTask, как показано ниже:

class Load extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... aurl) {
//do job seconds
//stop at here, and does not run onPostExecute
}
@Override
protected void onPostExecute(String unused) {
super.onPostExecute(unused);
wait = false;
new Load().execute();
}
}

И другой метод, как показано ниже:

public void click() {
new Load().execute();
while(wait) {
;
}
}

Ожидание является глобальным логическим значением.

Ответы [ 4 ]

4 голосов
/ 21 марта 2012

Этот код:

public void click() {
new Load().execute();
while(wait) {
;
}
}

заблокирует поток пользовательского интерфейса во время выполнения задачи.Это так же плохо, как просто запуск фоновой задачи на переднем плане и должно вызывать ошибку приложения не отвечает (ANR).Пожалуйста, не делайте этого.

Обратите внимание, что AsyncTask.onPostExecute() не будет вызвано, если задача отменена.Он также не будет вызван, если doInBackground выдает исключение.Все, что происходит в doInBackground, может быть причиной этого.

3 голосов
/ 21 марта 2012

это асинхронная система proppar way, вы не будете использовать wait в любом другом методе, или оба режима сна
используйте тот же обычный метод

private class AsyncTask extends AsyncTask<Void, Void, Void> {
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

        }

        @Override
        protected Void doInBackground(Void... params) {

        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            progressDialog.dismiss();

        }
    }
2 голосов
/ 21 марта 2012

Ваш while(wait){} цикл блокирует поток пользовательского интерфейса.onPostExecute работает в потоке пользовательского интерфейса.Поскольку вы блокируете, onPostExecute никогда не сможет выполнить.Кроме того, вы создаете новый экземпляр Load AsyncTask и выполняете его в onPostExecute, что означает, что у вас будет бесконечный цикл, если вы не отмените его в какой-то момент.

2 голосов
/ 21 марта 2012

Похоже, ваш doInBackground() метод выбрасывает Exception, попробуйте поместить его в try-catch блок.
Также я не знаю, почему вы звоните super.onPostExecute(), попробуйте удалить это тоже, этонет необходимости использовать это утверждение.

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