AsyncTask onPostExecute nunca se llama

No estoy seguro de lo que estoy haciendo mal, pero onPostExecute nunca se llama.

El onPreExecute (), doInBackground (..) se dispara, pero por alguna razón el onPostExecute nunca se llama.

¡Gracias de antemano!

Dave

  private class PostToOpenFeint extends AsyncTask<Void, Void, Void> { /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Void doInBackground(Void... params) { // does all the work here return null; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Toast.makeText(MainScreen.this, "Done syncing", Toast.LENGTH_LONG).show(); } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); Toast.makeText(MainScreen.this, "About to sync all your scores", Toast.LENGTH_LONG).show(); } 

Mirándolo más, esto es lo que pude observar. Por ejemplo, si hago esta llamada:

  new PostToOpenFeint.execute(); 

Justo después de onCreate de la actividad, entonces todo funciona bien. Si hago esta llamada diga dentro de un oyente de botón.

 settingsButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { new PostToOpenFeint.execute(); } }); 

El onPostExecute () nunca se llama, no estoy seguro de lo que estoy haciendo mal. La restricción que leí fue para llamar a esto desde la interfaz de usuario de hilo y lo estoy llamando desde el hilo de la interfaz de usuario.

Tenía un problema similar ahora mismo. Yo estaba extendiendo AsyncTask<Integer,Integer,Integer> y mi método onPostExecute se parecía a:

 protected void onPostExecute(int result) 

Esto me pareció bien, pero de nuevo soy más de un tipo .NET que un tipo Java. Lo cambié a:

 protected void onPostExecute(Integer result) 

Porque por alguna razón Java piensa que hay una diferencia entre int y Integer ?

Creo que tu problema es que estás declarando el tipo de retorno como void en tu:

 extends<Void,Void,Void> 

Eso significa que no hay parámetros, no hay progreso y ningún resultado. Si quieres ejecutar algo cuando se hace, creo que necesitas darle algún tipo de valor como y entero o un booleano.

Si cambia su extiende a:

 <Void,Void,Integer> 

Ahora su pasando no params, no publicar ningún progreso, pero están devolviendo un valor. Cambie su método onPostExecute para aceptar un Integer :

 protected void onPostExecute(Integer result) 

A continuación, cambie la devolución en su método doInBackground a algo como:

 return 1; 

Entonces debe ejecutar para usted.

Hay un gotcha más sobre AsyncTasks que acabo de pasar la mitad del día:

La clase AsyncTask debe cargarse en el subproceso de la interfaz de usuario. Esto se realiza automáticamente a partir de JELLY_BEAN.

Dice la documentación. En Gingerbread (y probablemente antes), dadas las circunstancias adecuadas, esto lleva a onPostExecute no se está ejecutando. La solución, sin embargo, es fácil,

 new MyAsyncTask(); 

Temprano en el hilo de interfaz de usuario para que la clase se carga antes de que cualquier cosa en el fondo puede cargarlo inadvertidamente.

Yo había utilizado una función estática en mi subclase AsyncTask de un subproceso de fondo que, dependiendo de la sincronización, se llamó antes de cualquier cosa en el subproceso de interfaz de usuario utilizado que AsyncTask subclase y bingo, un Heisenbug agradable.

(El oso conmigo para contestar a esta pregunta vieja, ya contestada, pero no encontré ese tidbit de la información dondequiera, y éste es mi primer poste)

Tenga en cuenta que si cancela la tarea mediante cancel() , onPostExecute() no se llamará. Bastante lógico, pero simplemente pasar por alto una llamada a ese método me había confundido.

Mi problema era que de alguna manera no @Override el método onPostExecute correctamente. Lo arreglé haciendo clic en el botón derecho del ratón-> fuente-> Override \ Implementar el método.

Espera que ayude a alguien

Tal vez el código en doInBackground () nunca vuelve?

Simplemente añada esto al código para su actividad. Es el problema de Async Task no inicializar correctamente como se supone que debe hacer.

  try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Simplemente cambie los parámetros en onPostExecute

 @Override protected void onPostExecute(Void unused) { ...} 

Ahora el método debe ser llamado.

Simplemente utilice los parámetros apropiados en onPostExecute, use public void onPostExecute (respuesta booleana) {} en lugar de public void onPostExecute (respuesta booleana) {} esto solucionó mi problema

  • Cómo recibir el estado de la intención del gestor de descargas hasta que el éxito de la descarga o no
  • Android AsyncTask Mejor manera de acceder al contexto de la actividad
  • Carga de imágenes asíncronas en un GridView (Android)
  • Rellenar ListView en fragmento después de Async hecho de la actividad
  • Cómo devolver anonymous Lista o ArrayList en AsyncTask en Android
  • AsyncTaskLoader vs AsyncTask
  • Android: descargar archivo grande
  • Asynctask vs. Thread vs Services vs Loader
  • Actualizar el subproceso de UI de AsyncTask en clase pública
  • ¿Por qué androide logcat no muestra el seguimiento de la pila para una excepción de tiempo de ejecución?
  • Thread.sleep detiene todas las Asyntasks anidadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.