Wie Daten von Rest-Service holen mit AsyncTask

  • 7 Antworten
  • Letztes Antwortdatum
B

Boris0815

Fortgeschrittenes Mitglied
4
Hallo,

ich nutze in meiner App einen Rest-Webserver um verschiedene Daten zu bekommen. Dies hat auch ohne Problem funktioniert. Nun Habe ich meine App auf einem 4.0-Device getestet und es funktioniert nicht mehr, da ich nicht mit AsycTask gearbeitet habe. Ich selber habe vorher immer mit einem 2.3-Device getestet.
Nun habe ich herausgefunden, dass ich die Restmethoden in einem AsyncTask aufrufen soll. (Sonst bekomme ich eine "android.os.NetworkOnMainThreadException")
Das passt nun aber garnicht in meine Architektur.
Kann ich das auch ohne AsyncTask machen? (Ich weis UI einfrieren etc. passiert aber nicht, das die Restmethoden kaum Daten enthalten) Synchron funktioniert eigentlich sehr gut in meinem Anwendungsfall.
Oder gibt es eine Möglichkeit auf die Asynchrone Methode zu warten um wieder synchron zu werden?
Beispielhaft:

Code:
    public List<String> GetList(String url){
        
       DownloadListTask task = new DownloadListTask();
        task.execute(new String[] { url });
        
        // Wait on task

        return listReturn;
Bitte keine Diskussion von wegen Asynchron oder nicht. In meinem Anwendungsfall funktioniert Synchron sehr gut.
In meinem Fall muss ich jedoch die Daten haben bevor ich weitermachen kann. Daher behindert mich Asynchron eher als es hilft.

Gruß

Boris
 
sorry es ist abosluter blödsinn, dass das synchron bei dir passen soll.


auch wenn grad bei deinen tests mit perfekten, schnellem wlan alles super läuft. deine user werden das nicht haben. es gibt umstände da dauert allein der aufbau der verbindung eine gefühlte ewigkeit. dann kommt ein schöner ANR und deine user werden spaß haben.

einfach ein interface basteln, am ende des asynctaskes nen callback abfeuern und schon bist wieder synchron.

Der ursprüngliche Beitrag 24.11.2012 von 23:43 Uhr wurde 25.11.2012 um 00:03 Uhr ergänzt:

und zur klarstellung:
google hat sich schon etwas dabei gedacht, dass sie eine exception werfen, wenn netzwerk operationen im main thread ausgeführt werden. das ist einfach schlecht und man tut es nicht.
 
sorry es ist abosluter blödsinn, dass das synchron bei dir passen soll.

Das hat nichts mit blödsinn zu tun...

Warum soll ich eine Methode Asynchron aufrufen, wenn ich die Methode aufrufe um dann direkt mit ihrem Ergebnis weiterarbeiten will? In der Zeit, egal wie lang diese ist, kann der User nichts anderes machen. Bei evtl. längeren Wartezeiten, zeig ich dem User auch eine Progressbar.

einfach ein interface basteln, am ende des asynctaskes nen callback abfeuern und schon bist wieder synchron.

einfach ist immer relativ... Wenn man einen Methodenaufruf durch mehrere Klassen durchreicht...

google hat sich schon etwas dabei gedacht, dass sie eine exception werfen, wenn netzwerk operationen im main thread ausgeführt werden. das ist einfach schlecht und man tut es nicht.

Wann hatte Google nochmal seine Weisheit in diesem Fall gefunden? Api3.0?
 
Du kannst aber keine progressbar anzeigen weil der ui thread blockiert ist.

Die exception kommt ab 3.0,ja. Google dachte wohl nicht, dass es so viele Apps geben wird, die das einfache Konzept nicht befolgen.

Gut die Diskussion ist eigentlich nicht nötig. Eine progressbar kannst nur anzeigen, wenn du die Verarbeitung der Daten im hintergrundthread machst. Geht einfach gar nicht anders.


Gesendet von meinem Galaxy Nexus mit der Android-Hilfe.de App
 
Wenn du das wirklich mit der Holzhammer-Methode machen willst, könntest du folgendes benutzen:

AsyncTask launchen
boolean asyncTaskRunning = true;
while(asyncTaskRunning) {
try { Thread.sleep(100); } catch (InterruptedException e) {}
}
...

Im AsyncTask onPostExecute() dann asyncTaskRunning = false;

Das ist dann aber eine extremst hässliche Lösung, und schreit praktisch nach ANRs.
 
Nein ich bin dabei das komplett auf AsyncTask umzubauen. Ist nen riesen Aufwand, bei der Masse an Methoden die ich habe.

Wieviel unbrauchbare Apps gibts inzwischen eigentlich bei Android, wenn man durch so ein Update Apps "killt"?
Abwärbskompatibel ist was anderes...
Ich finds komisch wenn ich extra auf ner alten API programmier um so viele Geräte wie möglich zu erreichen und dann auf den aktuellen nichts mehr geht.
 
wenn du viel mit Rest und Hintergrund/Vordergrund arbeitest kannst du dir mal die androidannotations anschauen. Die vereinfachen das sehr. Am Anfang etwas kompliziert, aber super wenn man es mal verstanden hat.

Eclipe Einrichtung
Rest Client
Threads 1
Threads 2

Dein Anwendungsfall würde dann in etwa so aussehen:

Code:
@Background
public void loadFromRest() {
  ...
  doneLoading(result);
}

@UiThread
public void doneLoading(Object result) {
  // doFancyStuffWithResult
}
 
  • Danke
Reaktionen: funglejunk
Boris0815 schrieb:
Wieviel unbrauchbare Apps gibts inzwischen eigentlich bei Android, wenn man durch so ein Update Apps "killt"?

Gibt noch viele User, die nur Gingerbread haben. :D
Aber auch bei diesen Geräten haben blockierte UI-Threads nie wirklich gut funktioniert.
 

Ähnliche Themen

AnnaBauer21
Antworten
14
Aufrufe
1.210
AnnaBauer21
AnnaBauer21
Zurück
Oben Unten