Ответ 1
Вы создали свою AsyncTask в потоке пользовательского интерфейса? Также добавьте @Override annotaiton в свой метод onPostExecute(), чтобы убедиться, что вы его правильно объявили.
По какой-то причине мой onPostExecute()
не вызывается после завершения моих AsyncTask
.
Объявление моего класса:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
My onPostExecute():
protected void onPostExecute(Boolean result)
Все работает отлично, мой doInBackground()
завершается успешно и возвращает логическое значение, но затем он заканчивается.
Спасибо
Вы создали свою AsyncTask в потоке пользовательского интерфейса? Также добавьте @Override annotaiton в свой метод onPostExecute(), чтобы убедиться, что вы его правильно объявили.
Запустили ли вы задачу с помощью метода execute()
? onPostExecute
не запускается, если вы просто вызываете doInBackground
.
Если ваши параметры onPostExecute(Param param)
не соответствуют тому, который вы определили с помощью extends AsyncTask<...,...,Param>
, и вы не использовали аннотацию @Override
, она никогда не будет выполнена, и вы не получите предупреждение от Eclipse.
Заметьте себе:
Просто всегда используйте аннотацию @Override
, и Eclipse поможет вам.
в Eclipse: Right-click in code > Source > Override/Implement Methods
После такой же проблемы и ни один из этих ответов не помог мне, я узнал, что мой поток пользовательского интерфейса заблокирован (я использовал CountDownLatch.await()) и, следовательно, метод onPostExecute(), который должен быть вызван Пользовательский интерфейс никогда не назывался.
У меня было такое же поведение, и причина в том, что я публиковал много сообщений как прогресс внутри doInBackground со следующим кодом:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
это должно было перегружать основную очередь сообщений thrad, и вызвало долгую задержку до вызова onPostExecute. Решение заключалось в публикации только один раз в секунду.
Сделала еще одну неприятную ошибку, которая может привести к этой же ошибке. При определении AsyncTask и вызове его я не вызывал execute
, а вызывал doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
а не
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");