web-dev-qa-db-fra.com

onPostExecute non appelé après l'achèvement de la tâche asynchrone

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

35
mlevit

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.

48
Romain Guy

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.

51
Konstantin Burov

Trouvé/fait une autre erreur méchante:

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.

Un autre moyen facile d’éviter toutes les erreurs nommées:

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

30
trichner

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 .

4
Hadas Kaminsky

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!

2
oiyio

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.

1
marcinj

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");
1
Anarchofascist

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.

0
AlanKley