2011-01-29 11 views
9

En un escenario en el que tengo una interfaz de usuario que se actualizará de un hilo separado (usando AsyncTask), I puede definir el AsyncTask como una clase interna de la actividad, pero esto tiene dos inconvenientes encuentro problemático:¿Cómo hacer cambios de UI de actividad desde una AsyncTask de Android?

  1. hace que los archivos de origen muy grande, lo que reduce la eficiencia en la gestión del código
  2. Esto hace que sea difícil de reutilizar la clase hilo

¿Qué es una buena solución? Usa una clase interna, pero resume todo lo que hace a otras clases? Pasar una referencia a la actividad a la AsyncTask? Defina siempre la clase AsyncTask como clase interna y solo acepte que los archivos fuente sean grandes.

Respuesta

2

Bastantes ejemplos que he visto simplemente pasan un Context en el constructor del AsyncTask.

public class BackgroundStuff extends AsyncTask<Void, Void, Void> { 
    ... 
    Context mContext; 
    ... 
    BackgroundStuff(Context context){ 
     super(); 
     this.mContext = context; 
    } 
    ... 
} 

Me interesaría saber si alguien más utiliza algún otro enfoque.

+0

Pasar de un contexto a la clase es lo que hago actualmente, parece bastante desordenado, pero tal vez no hay una mejor manera. –

13

Lo primero y más importante: al usar un AsyncTask no debe realizar actividad de IU en doInBackground().

Lo que puedes hacer es, si quieres p. el estado de actualización para un trabajo en segundo plano de larga duración es publishProgress(values) desde doInBackground(). El tiempo de ejecución entonces para esos valores llame a su callback onProgressUpdate(values), que se ejecuta en el hilo de la interfaz de usuario y desde donde puede actualizar la interfaz de usuario.

Echa un vistazo a, por ejemplo, https://github.com/pilhuhn/ZwitscherA/blob/master/src/de/bsd/zwitscher/TweetListActivity.java#L336 para ver un ejemplo.

La AsyncTask se puede implementar en un archivo de clase propio.

+0

El método doInBackground() no puede acceder a la IU, el marco arroja una excepción si lo intenta. Pero mi pregunta se relaciona más con cómo la subclase AsyncTask realmente accede a la IU. –

+0

@Olli esto es lo que digo: doInBackgrround() no debe acceder a la IU. O hazlo antes o después con onPre | PostExecute() o mientras tanto publicando el progreso. Esos tres métodos de devolución de llamada tienen permiso para acceder a la interfaz de usuario. –

0

Tengo un Punto de vista algo extraño con AsyncTasks porque generalmente prefiero usar Hilos normales, pero esencialmente la forma en que realizo una tarea en segundo plano y actualizo una UI es crear un Manejador al final del método onCreate(), luego anula el método handleMessage (Message msg).

Luego, en mi Subproceso, pasaré el Controlador como parámetro, luego cuando deseo hacer una actualización, enviaré un mensaje desde el subproceso al Manejador, ahora lo que hace es comunicarse desde el nuevo hilo de fondo en el hilo de la interfaz de usuario para procesar el trabajo en la interfaz de usuario.

Ahora imagino que AsyncTasks realiza una tarea similar, pero elimina la necesidad de implementar el método handleMessage de Handlers.

Sería interesante aprender más acerca de las ventajas/desventajas entre estos dos enfoques.

+0

Inicialmente utilicé Handler, pero no me conformé con eso, aunque esa es una percepción totalmente subjetiva.Me gusta la claridad de AsyncTask, y generalmente los divido como clases separadas (en lugar de una clase interna) lo que me ayuda a trabajar con ella y mantener la subclase de actividad más manejable. –

Cuestiones relacionadas