onPostExecute не вызывается после завершения AsyncTask
-
25-09-2019 - |
Вопрос
По какой- то причине мой onPostExecute()
назван не в честь моего AsyncTask
финиши.
Объявление моего класса:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
Мой onPostExecute():
protected void onPostExecute(Boolean result)
Все работает нормально, мой doInBackground()
успешно завершается и возвращает логическое значение, но затем оно просто завершается.
Спасибо
Решение
Вы создали свою асинктюду на ниве ui? Также добавьте метод @overRide Annotaiton в вашем методе OnPostexecute (), чтобы убедиться, что вы его правильно заявили.
Другие советы
Вы начали задачу с execute()
Метод? То onPostExecute
не будет запускать, если вы только что ссылаетесь doInBackground
.
Найдено / сделало еще одну противную ошибку:
Если ваши параметры onPostExecute(Param param)
не соответствует тому, который вы определили с extends AsyncTask<...,...,Param>
и вы не использовали @Override
Аннотация, он никогда не будет выполнен, и вы не получаете предупреждение от Eclipse.
Примечание для себя: просто всегда используйте @Override
Аннотация и затмение помогут вам.
Еще один простой способ избежать всех названных ошибок:
В затмении: Right-click in code > Source > Override/Implement Methods
После того, как одинаковую проблему, и ни один из этих ответов не помог мне, я узнал, что моя нить UI была заблокирована (я использовал CountDownLatch.await()
) и поэтому onPostExecute()
Метод, который должен быть вызван потоком пользовательского интерфейса, никогда не был вызван.
Допустил еще одну неприятную ошибку, которая может привести к такой же ошибке.Определяя AsyncTask и вызывая его, я не вызывал execute
но звал doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
вместо того , чтобы
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
Я столкнулся с той же проблемой. Ни один из вышеперечисленных решений не работал для меня. Затем я выяснил проблему, может быть, это помогает кому-то еще.
В UI TOTE я называю следующие коды:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
Моя определение класса Asyncckask:
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 не вызывается. Это из-за бесконечной петли после асинкт-казни. Асинктика и инфинитная петля ждет друг друга, чтобы закончить. Таким образом, код застрял!
Решение меняет дизайн!
У меня было такое же поведение, и причина заключалась в том, что я размещаю много сообщений как прогресс внутри Doinbackground со следующим кодом:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
Это должно быть перегружено главной очередной очереди сообщений, и вызвала длительную задержку до того, как onPostexuteCute будет вызываться. Решение было опубликовано только один раз в секунду.
Для меня это была пользовательская ошибка. Я заканчиваю асинктюс, призывая отменить (истинно) и не читал документацию достаточно близко, чтобы знать, что onPostexecute не вызывается в этом случае, нак.