OnPostExecute nicht nach Abschluss AsyncTask genannt
-
25-09-2019 - |
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
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.