Android AsyncTask – Orden de ejecución

Estoy enfrentando un problema con respecto al orden de exection de AsyncTasks.

Mi pregunta es :

Suponiendo que tengo 2 implementaciones de AsyncTask: MyAsyncTask1 y MyAsyncTask2

Que se llaman de la siguiente manera:

new MyAsyncTask1 ().execute (); new MyAsyncTask2 ().execute (); 

¿Se garantiza que MyAsyncTask1 se ejecuta antes de MyAsyncTask2 ? Una cosa es segura, no se ejecutan en paralelo ya que se utiliza el ejecutor predeterminado, que es SERIAL_EXECUTOR . El problema radica en el orden de ejecución: ¿qué se ejecutará primero?

Si no se determina el orden de ejecución, ¿cómo puedo hacer cumplir una orden de ejecución para las AsyncTasks?

Lo que necesito es tener MyAsyncTask1 ejecutado antes de MyAsyncTask2 , que no es siempre el caso, aunque estoy llamando a ejecutar para MyAsyncTask1 antes de MyAsyncTask2 .

Lo que realmente tengo es una actividad personalizada:

 public abstract class CustomActivity extends Activity { @Override protected void onCreate ( Bundle savedInstanceState ) { super.onCreate ( savedInstanceState ); new MyAsyncTask2 ().execute (); } } 

Y otra actividad que hereda de la actividad personalizada:

 public class MainActivity extends CustomActivity { @Override protected void onCreate ( Bundle savedInstanceState ) { new MyAsyncTask1 ().execute (); super.onCreate ( savedInstanceState ); } } 

Así que si utilizo MainActivity , MyAsyncTask1 debe ejecutarse antes de MyAsyncTask2 , al menos eso es el comportamiento que necesito.

La única manera de asegurarse de que dos subprocesos (que es lo que AsyncTasks básicamente son) se ejecutan en el orden que desea, es iniciar el segundo subproceso cuando el primero termina.

En su caso, para mantener la implementación abstraída y no tener que llamar realmente AsyncTask2 en el onPostExecute de AsyncTask1 (la forma Anup y Sanket sugerido, que también está bien si desea mezclarlos), hacer AsyncTask1 llamada super.executeAsyncTask2() , donde executeAsyncTask2() es un método en su CustomActivity que inicia la segunda AsyncTask

Con el fin de "encadenar" cualquier número de AsyncTasks, lo que hago es hacer que mis AsyncTasks reciban una devolución de llamada personalizada como un parámetro. Sólo tienes que definirlo así:

 public interface AsyncCallback(){ public void onAsyncTaskFinished(); } 

Su constructor de implementación AsyncTask debe tener un AsyncCallback como un parámetro, como este:

 private AsyncCallback callback; public AsyncTaskImplementation(AsyncCallback callback){ //Do whatever you're doing here this.callback = callback; } 

Por supuesto, si tienen más parámetros, no los borre.

A continuación, justo antes del final de onPostExecute , introduzca lo siguiente:

 if (callback != null) callback.onAsyncTaskFinished(); 

Por lo tanto, si pasa una devolución de llamada, AsyncTask ejecutará su devolución de llamada en el subproceso principal. Si no desea ejecutar ninguna devolución de llamada, simplemente pase null

Por lo tanto, para llamar a su cadena AsyncTask que acaba de escribir esto:

 new AsyncTask1(new AsyncCallback(){ public void onAsyncTaskFinished(){ new AsyncTask2(null).execute(); } }).execute(); 

Espero que esto te ayude 😉

Llame a su segunda tarea Async al final de la primera tarea Aysnc (es decir, al final del método onPostExecute() de su primera tarea asíncrona)

 //first async task's onPostExecute method onPostExecute() { //do your stuff and call second async task new MyAsyncTask2 ().execute (); } 

Esto garantizará la ejecución de la segunda tarea después de la primera de una manera simple y elegante.

Llame a la 2ª tarea en onPostExecute de la tarea 1 como

 @Override protected void onPostExecute(String string){//String or whatever u passed new MyAsyncTask2 ().execute (); } 

AsyncTask ejecutar en el fondo por lo que en su caso el primer código se iniciará task1 e inmediatamente iniciar task2 .. por lo que la llamada

 new MyAsyncTask2 ().execute (); 

Esto en para postexecute de Task1

No haga las cosas complicadas e intente mantener su diseño simple y limpio. La carrera entre sus dos AsyncTasks depende de la cantidad de procesamiento que llevan dentro de sus métodos anulados. Lógicamente, si desea que su AsyncTask1 se complete antes de AsyncTask2, simplemente agregue los bloques de código de su segundo Async dentro del primero.

O lanzar su segundo Async desde el onPostExecute de su primera Async – pero personalmente, eso parece innecesario.

  • Android obtiene actividad desde una clase anónima
  • AsyncTask Threading Rule - ¿Realmente sólo se puede usar una vez?
  • Carga de imagen asíncrona, compruebe si una imagen se recicla
  • Práctica recomendada para iniciar AsyncTask desde la vista personalizada
  • Facebook autoriza que no funcione dentro de Android Asynctask o Thread
  • Quiero reproducir un audio. ¿Utilizo Thread, AsyncTask o Service?
  • Cómo guardar un archivo con un hilo de fondo en Android
  • Android: ¿cómo esperar AsyncTask para terminar en MainThread?
  • Thread.sleep detiene todas las Asyntasks anidadas
  • Cuál es mejor: Loader o Fragmentos sin cabeza
  • Android Asynctask vs Runnable vs timertask vs Servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.