onPostExecute pas appelé après la fin AsyncTask
-
25-09-2019 - |
Question
Pour une raison quelconque mon onPostExecute()
n'est pas appelé après mes finitions AsyncTask
.
Ma classe decleration:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
Mon onPostExecute ():
protected void onPostExecute(Boolean result)
Tout fonctionne très bien, mon doInBackground()
se termine avec succès et retourne une valeur booléenne, mais il termine juste.
Merci
La solution
Avez-vous créé votre AsyncTask sur le thread d'interface utilisateur? Ajoutez également une annotation @Override sur votre méthode onPostExecute () pour vous assurer que vous avez déclaré correctement.
Autres conseils
Avez-vous commencé la tâche avec la méthode execute()
? Le onPostExecute
ne fonctionnerait pas si vous invoquez juste le doInBackground
.
Trouvé / a fait une autre erreur méchant:
Si votre params de onPostExecute(Param param)
ne correspondent pas à celui que vous avez défini avec extends AsyncTask<...,...,Param>
et vous ne pas utiliser l'annotation @Override
, il ne sera jamais exécuté et vous ne recevez pas un avertissement d'Eclipse.
Note à moi-même:
Il suffit de toujours utiliser l'annotation @Override
et Eclipse vous aider.
Une autre façon facile d'éviter toutes les erreurs nommées:
dans Eclipse: Right-click in code > Source > Override/Implement Methods
Après avoir le même problème et aucune de ces réponses m'a aidé, j'ai découvert que mon thread d'interface utilisateur a été bloqué (j'ai utilisé un CountDownLatch.await()
) et donc la méthode onPostExecute()
qui est censé être appelé par le thread d'interface utilisateur n'a jamais été appelé.
Fait une autre erreur désagréable qui peut entraîner cette même erreur. Lors de la définition du AsyncTask et de l'appeler, je ne demande pas execute
mais appelais doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
plutôt que
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
J'ai fait face au même problème. Aucune des solutions ci-dessus a fonctionné pour moi. Alors je compris le problème peut-être quelqu'un d'autre aide.
Dans thread d'interface utilisateur que 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 la 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 onPostExecute de code ci-dessus n'est pas appelé. Il est à cause d'une boucle infinie après l'exécution de AsyncTask. AsyncTask et inifini deux attend eachother à la fin. Ainsi, les stucks de code!
La solution est en train de changer la conception!
J'ai eu le même comportement, et la cause était que j'ai posterai beaucoup de messages comme un progrès dans doInBackground avec le code suivant:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
cela doit avoir une surcharge principale file d'attente de messages thrad et causé long délai avant onPostExecute ne s'appelle. La solution était de ne poster une fois par seconde.
Pour moi, il a commis une erreur de l'utilisateur. Je terminais la AsyncTask en invoquant annuler (true) sur elle et ne pas lire la documentation assez près pour savoir que onPostExecute n'est pas appelé dans ce cas, onCancelled est.