Подтвердить что ты не робот

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

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

Объявление моего класса:

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

My onPostExecute():

protected void onPostExecute(Boolean result)

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

Спасибо

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

Найдено/Сделана другая неприятная ошибка:

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

а не

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