Pour une raison quelconque, ma onPostExecute()
n'est pas appelée après la fin de ma AsyncTask
.
Ma décleration de classe:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
Mon onPostExecute ():
protected void onPostExecute(Boolean result)
Tout fonctionne bien, mon doInBackground()
se termine avec succès et renvoie un booléen, mais ensuite, il se termine.
Merci
Avez-vous créé votre AsyncTask sur le thread d'interface utilisateur? Ajoutez également une annotation @Override à votre méthode onPostExecute () pour vous assurer de la déclarer correctement.
Avez-vous commencé la tâche avec la méthode execute()
? La onPostExecute
ne serait pas exécutée si vous appeliez simplement la doInBackground
.
Si vos paramètres de onPostExecute(Param param)
ne correspondent pas à celui que vous avez défini avec extends AsyncTask<...,...,Param>
et que vous n'avez pas utilisé l'annotation @Override
, il ne sera jamais exécuté et vous ne recevrez aucun avertissement d'Eclipse.
Note à moi-même: Utilisez toujours toujours l'annotation @Override
et Eclipse vous aidera.
dans Eclipse: Right-click in code > Source > Override/Implement Methods
Après avoir eu le même problème et aucune de ces réponses ne m'a aidé, j'ai découvert que mon thread d'interface utilisateur était bloqué (j'ai utilisé un CountDownLatch.await()
) et donc la méthode onPostExecute()
qui est supposée être appelée par le thread d'interface utilisateur n'a jamais été appelée .
J'ai rencontré le même problème. Aucune des solutions ci-dessus n'a fonctionné pour moi. Ensuite, j'ai compris le problème peut-être que cela aide quelqu'un d'autre.
Dans l'interface utilisateur, j'appelle les codes suivants:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
Ma définition de classe 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;
}
}
dans le code ci-dessus, onPostExecute n'est pas appelé. C'est à cause d'une boucle infinie après l'exécution d'un asynctask . Asynctask et d'une boucle inifinite attendent que l'autre se termine. Ainsi le code colle!
La solution change le design!
J'ai eu le même comportement, et la cause était que j'ai posté beaucoup de messages comme une progression dans doInBackground avec le code suivant:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
cela doit avoir surchargé la file d'attente principale de messages thrad et causé un long délai avant que l'onPostExecute ne soit appelé. La solution consistait à ne poster qu'une fois par seconde.
Fait une autre erreur méchante qui peut entraîner cette même erreur. Lors de la définition de AsyncTask et de son appel, je n’appelais pas execute
mais j’appelais doInBackground
.
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
plutôt que
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
Pour moi, c'était une erreur d'utilisateur. Je terminais AsyncTask en invoquant cancel (true) dessus et en ne lisant pas suffisamment la documentation pour savoir que onPostExecute n'est pas appelé dans ce cas, onCancelled l'est.