4 Stimmen

Android: HTTP-Anfragen in AsyncTask sind nicht gleichzeitig.

Ich schreibe eine Fan-App für meine lokale Cinematheque, die den Spielplan für die nächsten Tage anzeigt. Die Liste der Filme pro Tag wird mithilfe eines parametrisierten HTTP-Aufruf von der Website abgerufen (Die Antwort enthält Hebräisch, also wenn Sie auf den Link geklickt haben und etwas Kauderwelsch erhalten haben, ist das wahrscheinlich in Ordnung).

Die App zeigt den Zeitplan für die nächsten acht Tage an, daher werden 8 Anfragen mit den Anforderungen des Tageszeitplans gestellt.

private class GetMoviesTask extends AsyncTask>

doInBackground() ruft die Liste der Filme pro Tag ab, und onPostExecute() aktualisiert die Benutzeroberfläche.

Der AsyncTask wird von MainActivity.onCreate() aufgerufen:

for (int i=0; i

`

Das Problem ist, dass der AsyncTask nicht gleichzeitig ausgeführt wird. Die Tage werden nacheinander langsam geladen, was quälend langsam ist:

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

Wie kann man diese AsyncCalls am besten gleichzeitig starten?

`

12voto

Giulio Piancastelli Punkte 14438

AsyncTask ist dafür bekannt, in Android 4.x eine Regression zu haben, bei der das System sie nacheinander ausführt, anstatt sie gleichzeitig auszuführen, wie es seit Android 1.6 der Fall war. Dies ist absichtlich so gewählt: Grundsätzlich können Sie auf neueren Plattformen zum alten parallelen Verhalten zurückkehren, indem Sie statt execute() executeOnExecutor() aufrufen. Mark Murphy (bekannt als Commonsware auf StackOverflow) hat alle Details sortiert auf seinem Blog.

0voto

Serdar Dogruyol Punkte 5127

Grundsätzlich erstellt AsyncTask nur einen Thread für Sie, der im Hintergrund läuft.

Sie können auf zwei Arten erreichen, was Sie wollen.

  • Erstens können Sie separate AsyncTasks für jede der Operationen erstellen.
  • Zweitens, indem Sie mehrere Threads in Ihrer doInBackground-Methode erstellen und gleichzeitige Anfragen und Prozesse durchführen. Danach können Sie Ihre Benutzeroberfläche benachrichtigen, indem Sie diese in onProgressUpdate oder onPostExecute veröffentlichen.

Überprüfen Sie dies

android asynctask with threading

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X