java - programacion - onPostExecute no se llama después de la finalización AsyncTask
manual de programacion android pdf (8)
Encontrado / hecho otro error desagradable:
Si sus parámetros de onPostExecute(Param param)
no coinciden con los que definió con extends AsyncTask<...,...,Param>
y no usó la anotación @Override
, nunca se ejecutará y usted don recibe una advertencia de Eclipse.
Nota para mí: solo use siempre la anotación @Override
y Eclipse lo ayudará.
Otra manera fácil de evitar todos los errores mencionados:
en Eclipse: Right-click in code > Source > Override/Implement Methods
Por alguna razón, mi onPostExecute()
no se llama después de que AsyncTask
mi AsyncTask
.
Mi declinación de clase:
public class setWallpaperForeground extends AsyncTask<String, Integer, Boolean>
My onPostExecute ():
protected void onPostExecute(Boolean result)
Todo funciona bien, mi doInBackground()
finaliza con éxito y devuelve un booleano, pero luego termina.
Gracias
¿Comenzó la tarea con el método execute()
? onPostExecute
no se ejecutará si solo doInBackground
el doInBackground
.
¿Creaste tu AsyncTask en el hilo de UI? También agregue una anotación @Override en su método onPostExecute () para asegurarse de que la declaró correctamente.
Cometió otro error grave que puede dar lugar a este mismo error. Al definir AsyncTask y llamarlo, no estaba llamando a execute
pero estaba llamando doInBackground
new AsyncTask<String,Void,Void>() {
....
}.doInBackground("parameter");
más bien que
new AsyncTask<String,Void,Void>() {
....
}.execute("parameter");
Después de tener el mismo problema y ninguna de estas respuestas me ayudó, descubrí que mi subproceso de interfaz de usuario estaba bloqueado (utilicé CountDownLatch.await()
) y, por lo tanto, el método onPostExecute()
que el subproceso de UI llamaba era nunca llamado.
He enfrentado el mismo problema. Ninguna de las soluciones anteriores funcionó para mí. Luego descubrí el problema, tal vez ayuda a otra persona.
En el hilo de UI, invoco los siguientes códigos:
public class XActivity ...{
onCreate(){
....
new SaveDrawingAsync(this).execute();
while(true)
{
if(MandalaActivity.saveOperationInProgress){
continue;
}
super.onBackPressed();
break;
}
...
}
}
Mi definición de clase AsyncTask:
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. Se debe a un ciclo infinito después de la ejecución asynctask. asynctask y loop inifinite esperan entre ellos para finalizar. ¡Así el código sobresale!
¡La solución está cambiando el diseño!
Para mí fue un error del usuario. Estaba terminando AsyncTask invocando cancel (true) en él y no leyendo la documentación lo suficientemente cerca como para saber que onPostExecute no se llama en este caso, onCancelled is.
Tuve el mismo comportamiento, y la causa fue que estuve publicando muchos mensajes como un progreso dentro de DoInBackground con el siguiente código:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// .. some UI updates
}
});
esto debe haber sobrecargado la cola principal de mensajes thrad, y provocó una gran demora antes de que onPostExecute recibiera una llamada. La solución fue publicar solo una vez por segundo.