2011-04-25 17 views
28

En un momento determinado de mi AsyncTask, después de algunas validaciones se han realizado, necesito a desovar cerca de otro hilo que hacer algún otro trabajo. Así que me gustaría tener dos hilos de fondo en este punto, cada uno haciendo su propia cosa (aproximadamente 2-3 segundos para ejecutar cada uno). La idea es maximizar el rendimiento en procesadores de doble núcleo como Atrix.Llamar a un AsyncTask de otro AsyncTask

¿Es aceptable crear otra asynctask & ejecutarla desde la primera? ¿Alguien puede sugerir una mejor manera de hacer esto?

Gracias!

EDIT: Me pregunto qué podría hacer incluso publishProgress() de la segunda tarea ... ya que no se inició desde una actividad?

Respuesta

55

¿Es aceptable para crear otro AsyncTask & ejecutarlo desde el primer uno?

Sí, pero sólo en el interior onProgressUpdate() o onPostExecute() ya que estos métodos se ejecuta en el hilo de interfaz de usuario. Por lo tanto, inicie el segundo AsyncTask en el subproceso de interfaz de usuario eligiendo uno de los dos métodos enumerados anteriormente.

Me pregunto qué publishProgress() de la segunda tarea sería incluso hacer ... ya que no se inició a partir de una Actividad?

Hace exactamente lo mismo, ya que lo está iniciando desde el hilo de la interfaz de usuario.

+0

Lanner: Gracias. Eso soluciona perfectamente mi problema. – OceanBlue

+0

¿Qué pasa con 'onPreExecute()' que también se ejecuta en el subproceso de interfaz de usuario? http://developer.android.com/reference/android/os/AsyncTask.html#onPreExecute%28%29 –

+0

@ ban-geoengineering El método onPreExecute(), como su nombre lo indica, se ejecutará antes que cualquier otro método en el AsyncTask, sin embargo, independientemente de que también se ejecute en el hilo de la interfaz de usuario. Básicamente, en caso de que necesite hacer algún cálculo o lógica cada vez antes de que comience doInBackground (...), este es su método. – tsukanomon

2

Un AsyncTask es útil para hacer un trabajo de fondo durante la comunicación con el hilo principal para manejar los cambios de interfaz de usuario. Parece que este no es tu caso.

Además, un AsyncTask debe ser ejecutado desde el hilo principal. A partir de la referencia AsyncTask:

Hay algunas reglas de roscado que deben seguirse para esta clase de trabajo adecuadamente :

  • La instancia de tarea debe crearse en el hilo de interfaz de usuario.
  • execute (Params ...) debe invocarse en el subproceso de la interfaz de usuario.

Puede un echar un vistazo a este article y ver lo que le queda mejor.

9

Si está buscando un mecanismo para ejecutar múltiples tareas asincrónicas, desde 3.0 y superior admite un método llamado executeOnExecutor que le permitirá programar tareas en paralelo en un grupo de subprocesos administrado por Async Task.

+0

+1 por la información. Esta aplicación en particular que estoy desarrollando tiene como objetivo 2.2 y superior, por lo que no puedo usar aquí, pero es bueno saberlo para el futuro. – OceanBlue

0

Esto se puede hacer usando mensaje de concurrencia de cruce y un único controlador.Prueba de concepto sigue:

private Handler myHandler= new Handler(){ 
    @Override 
    public void handleMessage(Message msg){   
     switch(msg.what){ 
      case 0: 
       Toast.makeText(Main.this,"Message0", Toast.LENGTH_SHORT).show(); 
       Thread thread= new Thread(new Runnable() { 
        public void run() { 
         try { 
          Thread.sleep(3000); 
         } 
         catch(Exception e){} 
         myHandler.sendEmptyMessage(2); 
        }  
       }); 
       thread.setDaemon(true); // <== I am a service provider. KILL ME if the non-daemon thread ConfuseText quits 
       thread.start(); 

      break; 
      case 1: 
       Toast.makeText(Main.this,"Message1", Toast.LENGTH_SHORT).show(); 
       break; 
      case 2: 
       Toast.makeText(Main.this,"Message2", Toast.LENGTH_SHORT).show(); 
       break; 
      default: 
       super.handleMessage(msg); 
       break; 
     } 
    } 
}; 

que puso en marcha el primer hilo en un clic de botón como en:

ON CLICK HANDLER 
      threadButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       Thread thread= new Thread(new Runnable() { 
        public void run() { 
         try { 
         Thread.sleep(1000); 
         } 
         catch(Exception e){ 
         } 
         myHandler.sendEmptyMessage(0); 
         try { 
         Thread.sleep(3000); 
         } 
         catch(Exception e){ 
         } 
         myHandler.sendEmptyMessage(1); 
        } 
       }); 
       thread.setDaemon(true); // <== I am a service provider. KILL ME if the non-daemon thread ConfuseText quits 
       thread.start(); 
      } 
}); 

Las llamadas para enhebrar el sueño es para imitar una tarea intensiva tiempo.

+1

Me pregunto si esto tiene alguna ventaja sobre AsyncTask, y en qué situación elegir uno sobre otro? –