2012-03-19 13 views
18

Tengo dos preguntas:inicio asíncrono de tareas dentro de un subproceso de trabajo

  • podemos empezar/ejecutar una tarea asíncrona dentro de un subproceso de trabajo?
  • En caso afirmativo, los métodos onPreExecute(), onProgressUpdate(Progress...) y onPostExecute(Result) se invocan en el hilo de la interfaz de usuario?

quiero saber que debido a que tengo una conexión TCP se ejecuta en un subproceso de trabajo y cuando se recibe un paquete que quiero iniciar un nuevo hilo para hacer el análisis sintáctico de este paquete y después de que la actualización de algunas estructuras de datos en la interfaz de usuario hilo.

¡Gracias de antemano!

+1

mientras AsyncTasks se adaptan muy bien para algunas cosas, parece que esta aplicación no es del todo una de ellas. como alternativa, podría lidiar simplemente con la subclase de la clase Thread – mfrankli

Respuesta

15

De los Android AsyncTask doc:

"La instancia de tarea se debe crear en el hilo de interfaz de usuario", y

"EJECUTAR (Parámetros ...) debe invocarse en el subproceso de interfaz de usuario."

Así que creo que la respuesta a su primera pregunta es "no". En cuanto al segundo, todos los métodos se invocan en el hilo de la interfaz de usuario, pero es un poco discutible.

EDITAR: No estoy seguro si esas son restricciones absolutas, o sugerencias fuertes, pero en ambos casos, recomendaría seguirlas.

5

De acuerdo con Android DoCo debe ejecutar un AsyncTask de un hilo de interfaz de usuario, pero en realidad depende de quien dirige esta línea en AsyncTask.class primera:

private static final InternalHandler sHandler = new InternalHandler(); 

Si usted tiene una AsyncTask que se llama el desde UI y subproceso de trabajo, puede evitar esta restricción al llamarlo primero desde el subproceso de interfaz de usuario. Si lo golpeas primero de tu hilo de trabajo estás condenado. Prefiero no confiar en esto ya que los detalles de implementación pueden cambiar en cualquier momento, pero este conocimiento es útil si usted, como yo, se pregunta "por qué funciona mi otra AsyncTask".

4

Desde el doc Android AsyncTask:

"La instancia de tarea se debe crear en el hilo de interfaz de usuario", y

"ejecutar (Parámetros ...) debe invocarse en el subproceso de interfaz de usuario "

Por lo tanto, el siguiente es legal.

new Thread(new Runnable() { 
       @Override 
       public void run() { 
        // do some work here 

        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          new MyAsyncTask(ctx).execute(); 
         } 
        }); 
       } 
      }).start(); 
+0

Esto no tiene sentido, entonces -1. Está comenzando un hilo desde un hilo principal, que delega la ejecución de una tarea en el hilo principal ... Lo mismo sucedería si acaba de ejecutar 'new MyAsyncTask (ctx) .execute();' en lugar de todo ese código sin sentido. – Cipi

+1

@Cipi Supongo que solo estaba señalando que puede llamar a 'runOnUiThread' desde dentro de cualquier hilo de trabajo. (desde el comentario '// haz algo de trabajo aquí') –

4

sólo para el registro: Si se inicia un AsyncTask fuera de la interfaz de usuario a enhebrar la OnPreExecute no se ejecutará desde la UI-Thread (pero desde el hilo de llamada). Esto conducirá a una excepción. Sin embargo, el método onPostExecute siempre se ejecutará en el UI-Thread. Espero ayudar a alguien :)

0

En simple, podemos iniciar AsyncTask en un trabajador. Puedes simplemente ejecutar AsyncTask en un nuevo subproceso, muy simple. La razón está en el código fuente de Android: [clike here]

private static class InternalHandler extends Handler { 
    public InternalHandler() { 
     super(Looper.getMainLooper()); 
    } 
} 
Cuestiones relacionadas