2012-05-21 5 views
10

Considera una AsyncTask iniciada en una actividad. ¿Qué sucede si la actividad se detiene o se destruye? ¿Se ejecutará onPostExecute()? En caso afirmativo, ¿qué hilo de interfaz de usuario se utilizará?¿Qué significa realmente "ejecutar en el hilo de UI" para onPostExecute()?

Solo me pregunto.

Muchas gracias de antemano.

+0

'onPostExcecute' se ejecutará, pero lanza una excepción para tratar de ejecutar en un hilo muerto si su actividad se destruye. Si tiene una AsyncTask ejecutándose cuando su actividad puede cerrarse, considere mover su código a un servicio o usar un cargador. – Jave

+0

en caso de Actividad destruida: Se bloqueará porque perdió la referencia con la Actividad de origen. En caso de Actividad detenida, aún se ejecuta en esa Actividad. Para este escenario: debe usar el servicio intencionado y obtener el resultado a través de Broadcast. –

Respuesta

10

El subproceso de interfaz de usuario está disponible durante toda la vida visible de la aplicación, que puede abarcar una combinación de actividades múltiples.

Cualquier cosa que cambie en los puntos de vista debe ser realizada en hilo de interfaz de usuario y onPostExecute de AsyncTask refleja la misma lógica mediante la ejecución de las instrucciones en el interior de hilo de interfaz de usuario.

Puede usar runOnUiThread en su propio Thread para realizar cambios en Views. Pero desde AsyncTask tiene en el método PostExecute (que también se ejecuta en el subproceso de la interfaz de usuario) por lo que lógicamente no necesita utilizar runOnUiThread allí.


actualización

cuanto a su pregunta: Sí, onPostExecute todavía será llamado (porque su invocado por un hilo separado), incluso si su actividad se destruye y si el método manipulará Vistas, simplemente obtendrá Force Close error porque la referencia a su actividad ya no está disponible.

+2

su pregunta es diferente, por favor léala de nuevo – Akram

0

Recuerde llamar a cancelar la función para que no tenga ninguna excepción en usted onPause o onDestroyed.

+0

Gracias por su respuesta. La respuesta de Wagas junto con tu consejo me dará una idea de cómo mejorar mi diseño actual aún más. –

1

Se bloqueará en onPostExecute() a causa de la interfaz de usuario como un Diálogo de proceso. Me pasa a mí, mi Actividad se destruye antes de que mi Asynctask se complete. Dice "ventana se filtró ....." Por lo tanto, elimino onPostExecute(). No more crash ..

Cuestiones relacionadas