Ich habe 2 ASyncTasks, man ruft einen Wert von einem httpPost und die anderen aktualisieren einige Elemente der Benutzeroberfläche (einschließlich einer Listview). Das Problem ist, da beide ASyncTasks den gleichen Hintergrundthread teilen, wenn die Netzwerkoperation zuerst startet und langsam läuft (wegen einer schlechten Netzwerkverbindung). Die anderen Hintergrund-Threads brauchen zu viel Zeit, um die App unverantwortlich zu machen.ASyncTasks blockiert andere
Da beide ASyncTasks unabhängig voneinander sind, ist es ziemlich dumm, den anderen zu warten. Es wäre logischer asynctasks verschiedene Klassen verwenden unterschiedliche Threads, bin ich falsch?
Lesen der ASyncTask doc. Gespräche über die Verwendung von executeOnExecutor(), aber wie kann ich das in einer API-Ebene niedriger als 11 lösen?
geht hier ein kleines Beispiel, das das "Problem"
new Task1().execute();
new Task2().execute();
Mit
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);
}
}
Warum haben Sie eine AsyncTask, um die Benutzeroberfläche zu aktualisieren? Sie müssen das synchron auf dem Ii-Thread tun. Führt Ihre UI AsyncTask etwas anderes im Hintergrundthread aus? –
Ich benutze es zum Beispiel um eine Listenansicht mit den Nachrichten zu zeigen. Im onPreExecute zeige ich die loading() UI, im Hintergrund die Nachrichten aus dem Internet und in der onPostExecute den Adapter der Listview zu. Ist dieser Ansatz falsch? – Addev
@Addev: Warum starten Sie nicht einfach die zweite 'AsyncTask' in der' onPostExecute (...) 'Methode der ersten? Wenn das, was Sie brauchen, ist, dass eine AsyncTask auf dem Ergebnis des anderen beruht, dann haben Sie tatsächlich eine synchrone Anforderung und Sie sollten nicht zwei asynchrone Operationen parallel ausführen. – Squonk