onPostExecute no se llama después de la finalización AsyncTask
-
25-09-2019 - |
Pregunta
Por alguna razón mi onPostExecute()
no se llama después de mis acabados AsyncTask
.
Mi clase decleration:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
Mi onPostExecute ():
protected void onPostExecute(Boolean result)
Todo funciona bien, mis finaliza las doInBackground()
con éxito y devuelve un booleano, pero entonces, sólo se termina.
Gracias
Solución
¿Ha creado su AsyncTask en el hilo de interfaz de usuario? También añadir una anotación @ Override de su método onPostExecute () para asegurarse de que usted declaró correctamente.
Otros consejos
¿Empezaste la tarea con método execute()
? El onPostExecute
no se presentaría si sólo invocar el doInBackground
.
Encontrados / Made otro error desagradable:
Si los parametros de onPostExecute(Param param)
no coinciden con el que definen con extends AsyncTask<...,...,Param>
y que no ha utilizado la anotación @Override
, nunca será ejecutado y que no te dan una advertencia de Eclipse.
Nota para mí misma:
Sólo utilice siempre la anotación @Override
y Eclipse le ayudará.
Otra manera fácil de evitar todos los errores con nombre:
en Eclipse: Right-click in code > Source > Override/Implement Methods
Después de tener el mismo problema y ninguna de estas respuestas me ayudaron, me enteré de que mi hilo de interfaz de usuario fue bloqueado (he usado un CountDownLatch.await()
) y por lo tanto el método onPostExecute()
que se supone que debe ser llamado por el hilo de interfaz de usuario nunca fue llamado.
cometió otro error desagradable que puede resultar en este mismo error. Al definir el AsyncTask y decir que es, no lo estaba llamando execute
pero estaba llamando doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
en lugar de
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
Me he enfrentado el mismo problema. Ninguna de las soluciones anteriores funcionó para mí. Entonces me di cuenta de que tal vez el problema ayuda a otra persona.
En la interfaz de usuario del hilo i llamar a los siguientes códigos:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
Mi AsyncTask definición de clase:
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;
}
}
en el código anterior onPostExecute no se llama. Es a causa de un bucle infinito después de la ejecución AsyncTask. AsyncTask y el bucle de espera inifinite ambos entre si a fin. Así, los stucks código!
La solución es cambiar el diseño!
he tenido el mismo comportamiento, y la causa fue que yo he estado publicando una gran cantidad de mensajes como un progreso en el interior con doInBackground siguiente código:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
esto debe haber sobrecargado cola principal mensaje thrad, y ha causado larga demora antes de onPostExecute conseguiría llamada. La solución fue publicar sólo una vez cada segundo.
Para mí fue un error del usuario. Yo estaba terminando la AsyncTask invocando cancelar (verdadero) en él y no leer la documentación suficiente cerca para saber que onPostExecute no se llama en este caso, es onCancelled.