¿Es posible ejecutar múltiples AsyncTask al mismo tiempo?

Tengo dos actividades en mi aplicación. En mi Actividad A estoy usando una AsyncTask y la segunda Actividad B también usando otra AsyncTask. En mi Actividad A, he subido algunos datos al servidor y en mi Actividad B estoy tratando de descargar algunos otros datos del servidor. Ambos se están ejecutando en AsyncTask. Mi problema es que cuando bash descargar datos del servidor en la actividad B en el método onPreExecute() se llamó pero no se doInBackground() método doInBackground() , está esperando que doInBackground() la doInBackground() acción doInBackground() la actividad A. ¿Por qué sucedió? ¿Es posible ejecutar más de una acción de fondo al mismo tiempo?

En la actividad A

 ImageButton submit_button = (ImageButton) findViewById(R.id.submit_button); submit_button.setOnClickListener(new OnClickListener() { public void onClick(View record_button) { new Save_data().execute(); } }); class Save_data extends AsyncTask { protected void onPreExecute() { } protected Integer doInBackground(String... arg0) { //uploading data here } } 

En mi actividad B

 ImageButton get_button = (ImageButton) findViewById(R.id.get_button); get_button.setOnClickListener(new OnClickListener() { public void onClick(View record_button) { new download_process().execute(); } }); class download_process extends AsyncTask { protected void onPreExecute() { Log.e("pre-execute","has been called");//This Log works well } protected Integer doInBackground(String... arg0) { //downloading data here } } 

use el ejecutor de la siguiente manera

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { new Save_data().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, location); } else { new Save_data().execute(location); } 

Mira esto

Sí, lo es, pero desde Honeycomb, hay un cambio en la forma en que se maneja AsyncTask en Android. Desde HC + se ejecutan secuencialmente, en lugar de dispararse en paralelo, como solía ser. La solución es llamarlos así (póngalo en una clase de herramientas por separado más o menos):

 public class AsyncTaskTools { public static > void execute(T task) { execute(task, (P[]) null); } @SuppressLint("NewApi") public static > void execute(T task, P... params) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); } else { task.execute(params); } } } 

y luego simplemente puedes llamar:

 AsyncTaskTools.execute( new MyAsyncTask() ); 

o con params (sin embargo, sugiero pasar parámetros a través del constructor de tareas):

 AsyncTaskTools.execute( new MyAsyncTask(),  );