onPostExecute не вызывается после завершения AsyncTask

По какой-то причине мой onPostExecute() не вызывается после завершения моего AsyncTask.

Декларация моего класса:

public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>

Мой onPostExecute():

protected void onPostExecute(Boolean result)

Все работает нормально, мой doInBackground() успешно завершается и возвращает логическое значение, но затем он просто завершается.

Спасибо


person mlevit    schedule 31.08.2010    source источник


Ответы (8)


Вы создали свою AsyncTask в потоке пользовательского интерфейса? Также добавьте аннотацию @Override в свой метод onPostExecute(), чтобы убедиться, что вы правильно объявили его.

person Romain Guy    schedule 31.08.2010
comment
У меня там не было @Override. Глядя на пример (developer.android.com/reference/android/os/AsyncTask .html), как и они. Почему у меня должен быть один над onPostExecute(), но ни один из других? - person mlevit; 31.08.2010
comment
Вроде на эмуляторе работает, а на телефоне нет. Когда фоновые процессы завершаются, всплывающее уведомление не появляется. Макет выглядит так, как будто он перезагружается по какой-то неизвестной причине. Любые идеи? - person mlevit; 31.08.2010
comment
Вам не обязательно иметь @Override, но это способ убедиться, что вы правильно переопределили метод. - person Romain Guy; 31.08.2010
comment
Я совершил ошибку, использовав OnPostExecute вместо onPostExecute. Спасибо за подсказку :) - person rogerstone; 03.06.2011
comment
У меня была Asynctask, созданная вне потока пользовательского интерфейса. Спасибо за решение! - person Radu; 18.01.2013
comment
Я получаю сообщение об ошибке при переопределении onPostExecute... кто-нибудь знает, почему? - person Darrell; 23.07.2014

Вы запускали задачу методом execute()? onPostExecute не запустится, если вы просто вызовете doInBackground.

person Konstantin Burov    schedule 31.08.2010
comment
Помог мне. Отличный ответ. Спасибо. - person Booger; 05.02.2013
comment
@Konstantin Чем вызвать onpostexecute()? - person Animesh Mangla; 10.01.2016
comment
@developer onPostExecute вызывается автоматически после возврата doInBackground. Если для асинхронной задачи не была вызвана отмена. - person Konstantin Burov; 11.01.2016
comment
@KonstantinBurov да, теперь он просыпается. Спасибо :) - person Animesh Mangla; 11.01.2016

Нашел/сделал еще одну неприятную ошибку:

Если ваши параметры onPostExecute(Param param) не соответствуют тем, которые вы определили с помощью extends AsyncTask<...,...,Param>, и вы не использовали аннотацию @Override, она никогда не будет выполнена, и вы не получите предупреждение от Eclipse.

На заметку: всегда используйте аннотацию @Override, и Eclipse вам поможет.

Еще один простой способ избежать всех названных ошибок:

в Затмении: Right-click in code > Source > Override/Implement Methods

person trichner    schedule 20.06.2012
comment
Я только что решил здесь проблему моего коллеги - он использовал логическое значение вместо логического! - person PayToPwn; 08.05.2017

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

person Hadas Kaminsky    schedule 24.11.2015
comment
Спасибо, это сэкономило мне часы! - person oggmonster; 23.02.2018

Сделал еще одну неприятную ошибку, которая может привести к этой же ошибке. При определении AsyncTask и его вызове я вызывал не execute, а doInBackground

new AsyncTask<String,Void,Void>() {
    ....
}.doInBackground("parameter");

скорее, чем

new AsyncTask<String,Void,Void>() {
    ....
}.execute("parameter");
person Anarchofascist    schedule 02.08.2017

Я столкнулся с той же проблемой. Ни одно из вышеперечисленных решений не сработало для меня. Затем я понял проблему, может быть, это поможет кому-то еще.

В потоке пользовательского интерфейса я вызываю следующие коды:

public class XActivity ...{
    onCreate(){
        ....

        new SaveDrawingAsync(this).execute();

        while(true)
        {
            if(MandalaActivity.saveOperationInProgress){
                continue;
            }
            super.onBackPressed();
            break;
        }

        ...
    }
}

Мое определение класса AsyncTask:

public class SaveAsync extends AsyncTask<Object, Void, Void> {

    @Override
    public Void doInBackground(Object... params) {
        saveThem(); // long running operation
        return null;
    }

    @Override
    public void onPostExecute(Void param) {
        XActivity.saveOperationInProgress = false;
    }

    @Override
    public void onPreExecute() {
       XActivity.saveOperationInProgress = true;
    }

}

в приведенном выше коде onPostExecute не вызывается. Это происходит из-за бесконечного цикла после выполнения асинхронной задачи. asynctask и бесконечный цикл ждут завершения друг друга. Таким образом, код застревает!

Решение - изменение дизайна!

person oiyio    schedule 05.07.2018

У меня было такое же поведение, и причина заключалась в том, что я публиковал много сообщений в качестве прогресса внутри doInBackground со следующим кодом:

new Handler(Looper.getMainLooper()).post(new Runnable() {
   @Override
   public void run() {
     // .. some UI updates
   }
});

это должно было перегрузить основную очередь сообщений thrad и вызвать длительную задержку перед вызовом onPostExecute. Решение состояло в том, чтобы публиковать только один раз в секунду.

person marcinj    schedule 23.01.2016
comment
Я подсчитывал количество секунд (используя System.currentTimeMillis()) между каждым разом, когда я отправлял сообщения в обработчик. - person marcinj; 22.02.2016

Для меня это была ошибка пользователя. Я завершал AsyncTask, вызывая для него команду cancel(true) и недостаточно внимательно читая документацию, чтобы знать, что onPostExecute в этом случае не вызывается, а onCancelled.

person AlanKley    schedule 26.04.2018