Frage

Aus irgendeinem Grund meine onPostExecute() nicht nach meinem AsyncTask beendet genannt wird.

Meine Klasse decleration:

public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>

Meine OnPostExecute ():

protected void onPostExecute(Boolean result)

Alles funktioniert gut, mein doInBackground() erfolgreich abgeschlossen und gibt einen Booleschen aber dann endet es.

Danke

War es hilfreich?

Lösung

Haben Sie erstellen Ihre AsyncTask auf dem UI-Thread? Fügen Sie auch eine @Override Anmerkung auf Ihrem OnPostExecute () -Methode, um sicherzustellen, dass Sie es richtig erklärt.

Andere Tipps

Haben starten Sie die Aufgabe mit execute() Methode? Die onPostExecute würde, wenn man nur rufen Sie das doInBackground nicht ausgeführt werden.

Gefunden / Made andere böse Fehler:

Wenn Ihr params von onPostExecute(Param param) nicht das überein Sie mit extends AsyncTask<...,...,Param> definiert und Sie nicht die @Override Annotation verwendet haben, wird es nie ausgeführt werden und Sie nicht bekommen, eine Warnung von Eclipse-.

Hinweis mir: Nur immer die @Override Annotation verwenden und Eclipse werden Ihnen helfen.

Eine weitere einfache Möglichkeit, alle genannten Fehler zu vermeiden:

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

Nach dem gleichen Problem und keines dieser Antworten hat mir geholfen, fand ich heraus, dass mein UI-Thread blockiert wurde (ich habe ein CountDownLatch.await() ) und damit die onPostExecute() Methode, die angeblich von dem UI-Thread aufgerufen wird, wurde nie genannt.

Aus einem anderen bösen Fehlern, die in diesem gleichen Fehler führen können. Wenn die AsyncTask definieren und nannte es, ich war nicht execute Aufruf aber rief doInBackground

new AsyncTask<String,Void,Void>() {
    ....
}.doInBackground("parameter");

statt

new AsyncTask<String,Void,Void>() {
    ....
}.execute("parameter");

Ich habe das gleiche Problem. Keine der oben genannten Lösungen für mich gearbeitet. Dann dachte ich, das Problem vielleicht hilft es jemand anderes.

In UI-Thread i die folgenden Codes nennen:

public class XActivity ...{
    onCreate(){
        ....

        new SaveDrawingAsync(this).execute();

        while(true)
        {
            if(MandalaActivity.saveOperationInProgress){
                continue;
            }
            super.onBackPressed();
            break;
        }

        ...
    }
}

Mein AsyncTask Klassendefinition:

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;
    }

}

im obigen Code OnPostExecute wird nicht aufgerufen. Es ist wegen einer Endlosschleife nach AsyncTask Ausführung. AsyncTask und inifinite Schleife sich beide wartet bis zum Ende. So ist der Code stuck!

Die Lösung verändert das Design!

Ich hatte das gleiche Verhalten und die Ursache war, dass ich mit folgendem Code eine Menge von Nachrichten als Fortschritt innerhalb doInBackground Posting:

new Handler(Looper.getMainLooper()).post(new Runnable() {
   @Override
   public void run() {
     // .. some UI updates
   }
});

Dies muss Haupt Thrad Nachrichten-Warteschlange überlastet und verursacht lange Verzögerung, bevor OnPostExecute würde aufgerufen. Die Lösung war nur einmal pro Sekunde zu senden.

Für mich war es Benutzerfehler. Ich war die AsyncTask Endung durch (true) aufrufen Abbrechen darauf und die Dokumentation nicht eng genug lesen zu wissen, dass OnPostExecute in diesem Fall nicht aufgerufen wird, onCancelled ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top