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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top