Domanda

Per qualche motivo il mio onPostExecute() non viene chiamato dopo i miei finiture AsyncTask.

La mia classe decleration:

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

Il mio OnPostExecute ():

protected void onPostExecute(Boolean result)

Tutto funziona bene, i miei completa doInBackground() successo e ritorna un valore booleano, ma poi appena finisce.

Grazie

È stato utile?

Soluzione

Hai creato il tuo AsyncTask sul thread UI? Anche aggiungere un'annotazione @Override sul OnPostExecute () per assicurarsi che hai dichiarato correttamente.

Altri suggerimenti

Hai iniziato l'attività con metodo execute()? Il onPostExecute non correrebbe se semplicemente invocare il doInBackground.

Trovato / fatto un altro brutto errore:

Se i params di onPostExecute(Param param) non corrispondere a quello definito con extends AsyncTask<...,...,Param> e non è stato utilizzato l'annotazione @Override, non potrà mai essere eseguito e non si ottiene un avvertimento da Eclipse.

Nota a me stesso: Basta utilizzare sempre l'annotazione @Override e Eclipse vi aiuterà.

Un altro modo semplice per evitare tutti gli errori di nome:

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

Dopo aver lo stesso problema e nessuna di queste risposte mi ha aiutato, ho scoperto che il mio thread dell'interfaccia utente è stato bloccato (io ho usato un CountDownLatch.await() ) e quindi il metodo onPostExecute() che dovrebbe essere chiamato dal thread UI non è mai stato chiamato.

fatto un altro brutto errore che può risultare in questo stesso errore. Quando si definisce l'AsyncTask e chiamando, io non chiamavo execute ma chiamavo doInBackground

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

anziché

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

Ho affrontato lo stesso problema. Nessuna delle soluzioni di cui sopra ha funzionato per me. Poi ho capito il problema forse aiuta a qualcun altro.

In UI filo chiamo i seguenti codici:

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

        new SaveDrawingAsync(this).execute();

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

        ...
    }
}

Il mio AsyncTask definizione di classe:

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

}

nel codice sopra OnPostExecute non viene chiamato. È a causa di un loop infinito dopo l'esecuzione AsyncTask. AsyncTask e ciclo Inifinite entrambe attese vicenda alla fine. Così il codice stucks!

La soluzione sta cambiando il disegno!

Ho avuto lo stesso comportamento, e la causa è stata che ho postando un sacco di messaggi come un progresso all'interno doInBackground con seguente codice:

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

questo deve essere sovraccaricato coda principale messaggio thrad, e ha provocato lungo ritardo prima OnPostExecute otterrebbe chiamato. La soluzione era quella di inviare solo una volta ogni secondo.

Per me è stato un errore dell'utente. Stavo finendo l'AsyncTask invocando annullare (vero) su di esso e non leggere la documentazione abbastanza da vicino per sapere che OnPostExecute non è chiamato in questo caso, è onCancelled.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top