Ho 2 ASyncTasks, uno recupera un valore da un httpPost e l'altro aggiorna alcuni elementi dell'interfaccia utente (inclusa una list list). Il problema è che poiché entrambi gli ASyncTasks condividono lo stesso thread in background, se l'opperazione della rete inizia per prima e viene eseguita lentamente (a causa di una cattiva connettività di rete). Gli altri thread in background impiegano troppo tempo a rendere l'app irresponsabile.ASyncTask che bloccano gli altri
Poiché entrambi i cicli ASync sono indipendenti, è piuttosto stupido da fare aspettare l'altro. Sarebbe più logico asincronizzare diverse classi usano thread diversi, sbaglio?
Lettura del ASyncTask doc. Parla dell'utilizzo di executeOnExecutor(), ma come posso risolverlo in un livello API inferiore a 11?
qui va un piccolo esempio che riproduce il "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);
}
}
Perché hai un AsyncTask per aggiornare l'interfaccia utente? È necessario farlo in modo sincrono sul thread Ii. Il tuo UI AsyncTask fa qualcos'altro sul thread in background? –
Lo ad esempio per mostrare una listview con le notizie. In onPreExecute mostro l'interfaccia utente di caricamento(), in background recupera le notizie da Internet e in onPostExecute assegna l'adattatore a listview. Questo approccio è errato? – Addev
@Addev: Perché non inizi il secondo 'AsyncTask' nel metodo' onPostExecute (...) 'del primo? Se ciò di cui hai bisogno è che un 'AsyncTask' si basa sul risultato dell'altro, hai effettivamente un requisito sincrono e non dovresti eseguire due operazioni asincrone in parallelo. – Squonk