onPostExecute не вызывается после завершения AsyncTask - PullRequest
35 голосов
/ 31 августа 2010

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

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

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

Мой onPostExecute ():

protected void onPostExecute(Boolean result)

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

Спасибо

Ответы [ 8 ]

51 голосов
/ 31 августа 2010

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

48 голосов
/ 31 августа 2010

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

30 голосов
/ 21 июня 2012

Найдена / совершена еще одна неприятная ошибка:

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

Примечание для себя: просто всегда используйте аннотацию @Override, и Eclipse поможет вам.

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

в Eclipse: Right-click in code > Source > Override/Implement Methods

4 голосов
/ 24 ноября 2015

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

2 голосов
/ 05 июля 2018

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

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

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 и inifinite loop оба ждут друг друга, чтобы закончить.Таким образом, код застрял!

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

1 голос
/ 02 августа 2017

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

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

вместо

new AsyncTask<String,Void,Void>() {
    ....
}.execute("parameter");
1 голос
/ 23 января 2016

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

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

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

0 голосов
/ 26 апреля 2018

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

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