uso termine studio runonuithread que peticiones oncancelled hilos esperar definicion asynctask asincronos asincronas android multithreading

termine - peticiones asincronas android



Llamar a una AsyncTask desde otra AsyncTask (4)

En un cierto punto de mi AsyncTask, después de que se hayan realizado algunas validaciones, necesito generar otro hilo para realizar otro trabajo. Así que me gustaría dos subprocesos de fondo en este punto, cada uno haciendo lo suyo (aproximadamente 2-3 segundos para ejecutar cada uno). La idea es maximizar el rendimiento en procesadores de doble núcleo como Atrix.

¿Es aceptable crear otro asynctask y ejecutarlo desde el primero? ¿Alguien puede sugerir una mejor manera de hacer esto?

¡Gracias!

EDITAR: Me pregunto qué haría publishProgress () de la segunda tarea ... ¿ya que no se inició desde una Actividad?


¿Es aceptable crear otro asynctask y ejecutarlo desde el primero?

Sí, pero solo dentro de onProgressUpdate() o onPostExecute() ya que estos métodos se ejecutan en el subproceso de la interfaz de usuario. Por lo tanto, inicie la segunda AsyncTask en el subproceso de la interfaz de usuario seleccionando uno de los dos métodos enumerados anteriormente.

Me pregunto qué haría publishProgress () de la segunda tarea ... ¿ya que no se inició desde una Actividad?

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


Esto se puede hacer usando mensajes de concurrencia y un solo controlador. A continuación se muestra el código de prueba de concepto:

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; } } };

Puse en marcha el primer hilo en un clic del 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 a la suspensión del hilo es para imitar una tarea que requiere mucho tiempo.


Si está buscando un mecanismo para ejecutar múltiples tareas asíncronas, desde la executeOnExecutor 3.0 y posteriores es compatible con un método llamado executeOnExecutor que le permitirá programar tareas en paralelo en un grupo de subprocesos administrados por Async Task.


Una AsyncTask es útil para hacer un trabajo de fondo mientras se comunica con el hilo principal para manejar los cambios en la interfaz de usuario. Parece que este no es tu caso.

Además, una AsyncTask debe ejecutarse desde el hilo principal. De la referencia de AsyncTask:

Hay algunas reglas de subprocesamiento que se deben seguir para que esta clase funcione correctamente:

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

Puede echar un vistazo a este article y ver qué se ajusta mejor a usted.