OnPostExecute non chiamato dopo il completamento AsyncTask
-
25-09-2019 - |
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
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.