Tengo 2 ASyncTasks, uno recupera un valor de un httpPost y el otro actualiza algunos elementos de la IU (incluyendo una vista de lista). El problema es que ambas ASyncTasks comparten el mismo hilo de fondo, si la operación de red comienza primero y se ejecuta lentamente (debido a una mala conectividad de red). El resto del hilo de fondo lleva demasiado tiempo haciendo que la aplicación sea irresponsable.ASyncTasks que bloquean a otros
Dado que ambos ASyncTasks son independientes, es bastante estúpido hacer esperar al otro. Sería más lógico que asynctasks diferentes clases utilizan diferentes hilos, ¿me equivoco?
Leyendo el ASyncTask doc. Habla sobre el uso de executeOnExecutor(), pero ¿cómo puedo resolverlo en un nivel de API inferior a 11?
Aquí va un pequeño ejemplo que reproduce el "problema"
new Task1().execute();
new Task2().execute();
Con
public class Task1 extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 1");
SystemClock.sleep(9000);
GLog.e("doInBackground end 1");
return null;
}
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 1");
super.onPreExecute();
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 1");
super.onPostExecute(result);
}
}
public class Task2 extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
GLog.e("onPreExecute 2");
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
GLog.e("doInBackground start 2");
SystemClock.sleep(9000);
GLog.e("doInBackground end 2");
return null;
}
@Override
protected void onPostExecute(Void result) {
GLog.e("onPostExecute 2");
super.onPostExecute(result);
}
}
¿Por qué tiene una AsyncTask para actualizar la UI? Necesitas hacer eso sincrónicamente en el hilo Ii. ¿Tu UI AsyncTask hace algo más en el hilo de fondo? –
Lo uso, por ejemplo, para mostrar una vista de lista con las noticias. En el comando onPreExecute muestro la interfaz de usuario loading(), en segundo plano recupero las noticias de Internet y en el onPostExecute asigno el adaptador a la vista de lista. ¿Es ese enfoque incorrecto? – Addev
@Addev: ¿Por qué no acaba de iniciar el segundo 'AsyncTask' en el método' onPostExecute (...) 'del primero? Si lo que necesita es que una 'AsyncTask' se base en el resultado de la otra, entonces efectivamente tiene un requisito síncrono y no debe ejecutar dos operaciones asincrónicas en paralelo. – Squonk