Gibt Daten von AsyncTask Android zurück

8

Ich habe versucht, ähnliche Fragen zu SO zu stellen, aber habe keine Hilfe bekommen.

In meiner Android-App plane ich die Implementierung von Letztes Zitat, das der Benutzer besucht hat, d. h. ähnlich wie kürzlich besuchte Seiten im Internet.

Im Folgenden sind die Schritte, die ich befolge:

1.) Wenn der Benutzer eine Firmenansicht öffnet, holt er die Firmensymbole aus der Datenbank

2.) Speichern Sie das aktuelle Symbol zusammen mit dateTime in der Datenbank.

3.) Für alle Symbole, die aus der Datenbank abgerufen werden, Holen Sie ihre current value und %Change und zeigen Sie Firmenname, aktueller Wert und% Change in einer Liste an.

Das Problem tritt in der Klasse ASyncTask auf, da die Methode postExecute es nicht erlaubt, dass der Rückgabetyp anders als void ist.

Mache ich irgendetwas falsch?

Jede Hilfe wird Lebensretter sein !!!

%Vor%     
GAMA 19.01.2012, 05:01
quelle

3 Antworten

8

postExecute () kann keinen Wert zurückgeben, weil wer oder was würde es zurückgeben? Ihre ursprüngliche Methode, die die AsyncTask aufgerufen hat, ist weg, da Ihre AsyncTask im Hintergrund ausgeführt wird. Es ist asynchrone Bedeutung, wenn AsyncTask.execute () gibt es noch im Hintergrund ausgeführt, und daher postExecute () kann keinen Wert zurückgeben, da es nichts gibt, um es zurück zu geben.

Stattdessen benötigt Ihre AsyncTask eine Referenz zurück zu Ihrer Aktivität oder einem anderen Objekt, damit Ihre Werte dorthin zurückgeschrieben werden können. In Ihrem Code können die Zeilen nach dem Aufruf von execute () nicht da sein, weil Ihre Aufgabe noch nicht abgeschlossen ist. Stattdessen sollten Sie eine Methode namens updateSymbol (currentPrice, percentChange) erstellen, den gesamten Code unterhalb von execute () dorthin verschieben und in Ihrer AsyncTask sollten Sie einen Verweis auf die Aktivität übergeben. Rufen Sie dann updateSymbol (currentPrice, percentChange) von der onPostExecute () -Methode auf.

Seien Sie jedoch vorsichtig, wenn Sie eine Referenz zu einer Aktivität haben, die zerstört werden kann, während Ihr doInBackground () ausgeführt wird, und wenn postExecute () ausgeführt wird, sollten Sie einfach die Ergebnisse löschen oder nicht versuchen, die Benutzeroberfläche zu aktualisieren. Beispielsweise dreht der Benutzer sein Telefon, wodurch die Aktivität zerstört wird. Ich finde es am besten, einen Verweis auf die AsyncTask in der Aktivität zu halten, so dass sie () abbrechen kann, wenn die Aktivität zerstört wird. Sie können AsyncTask.cancel () aufrufen und dann prüfen, ob Ihre Aufgabe abgebrochen wurde:

%Vor%

Es ist wirklich einfach, eine Basisklasse für alle Aktivitäten zu erstellen, so dass Sie leicht verfolgen können, wie AsyncTasks läuft:

%Vor%

Einige schnelle Hinweise. Du brauchst keine execute (new String [] {"blah" + blah}). Varargs in Java ermöglichen dies. ausführen ("blah" + blah). Sie fangen auch Ausnahmen ein und fahren fort, ohne sie wirklich zu handhaben. Es wird schwer werden, wenn etwas wirklich passiert, weil deine App sie fängt und einfach so weitergeht, als wäre nichts passiert. Wenn Sie einen Fehler erhalten, möchten Sie möglicherweise dem Benutzer eine Rückmeldung geben und die Ausführung dieses Prozesses beenden. Stoppen Sie, zeigen Sie dem Benutzer einen Fehler und lassen Sie ihn das nächste tun. Verschieben Sie die Catch-Blöcke an den unteren Rand der Methoden.

    
chubbsondubs 19.01.2012, 05:19
quelle
3

Im Wesentlichen wird mit AsyncTask.onPostExecute () alles getan, was Sie tun möchten, nachdem doinBackground () von AsyncTask ausgeführt wurde und das Ausführungsergebnis zurückgegeben wurde. Dies sollte als die beste Vorgehensweise angesehen werden.

Wenn AsyncTask (). execute () vom UI-Thread aufgerufen wird (beachten Sie, dass diese Methode vom UI-Thread aufgerufen werden muss), erstellt das Android-Framework einen Worker-Thread und startet, was auch immer Sie in AsyncTask.doInBackground () geschrieben haben. auf diesem Arbeitsthread. An dieser Stelle (nach dem Aufruf von new AsyncTask (). Execute ()) führt der UI-Thread weiterhin Code nach der neuen AsyncTask () aus. Execute (). Während der Laufzeit haben Sie also zwei Threads (UI und Worker-Thread) gleichzeitig ausgeführt.

Aber wo und wann wird das Ausführungsergebnis von AsyncTask vom Worker-Thread zurück in den UI-Thread zurückgegeben?

Der Punkt, an dem Ihr Worker-Thread (doInBackground ()) beendet und zum UI-Thread zurückkehrt, ist AysncTask.onPostExecute (). Diese Methode wird garantiert vom Framework im UI-Thread aufgerufen, sobald AsyncTask beendet wird. Mit anderen Worten, es ist uns egal, wo und wann AsyncTask.onPostExecute () zur Laufzeit aufgerufen wird, wir müssen nur garantieren, dass es irgendwann in der Zukunft aufgerufen wird. Dies ist der Grund, warum diese Methode kein Ausführungsergebnis zurückgibt. Stattdessen muss das Ausführungsergebnis als einziger Methodenparameter von doInBackground () übergeben werden.

Zusätzlich bietet die Android-API eine Möglichkeit, ein AsyncTask-Ausführungsergebnis zur Codierungszeit zurückzugeben: AsyncTask.get () :

%Vor%

Beachten Sie, dass AsyncTask.get () die Ausführung des aufrufenden Threads blockiert und Sie wahrscheinlich eine ANR-Ausnahme erhalten, wenn Sie sie im UI-Thread aufrufen. Dies ist die Nutzlast der Verwendung von AsyncTask .get (), indem Sie sie auf dem UInthread aufrufen, machen Sie Ihre AsyncTask (Arbeitsthread) tatsächlich synchron mit dem UI-Thread (indem Sie den UI-Thread warten lassen). Zusammenfassend ist dies machbar, aber nicht empfehlenswert.

    
yorkw 19.01.2012 06:46
quelle
1

Nur für zukünftige Referenz, weil dieser Beitrag ein wenig alt ist:

Ich habe eine Aktivitätsklasse mit einer onStart () -Methode und einer separaten Klasse für die AsyncTask erstellt. Basierend auf meinem Test wird das Ergebnis nach der doInbackground () Methode zuerst an die Aktivität gesendet und danach wird onPostExecute () ausgeführt. Dies liegt daran, dass ich basierend auf logcat zuerst meine Antwortdaten (vom Server gesendet) habe, dann wird diese Antwort wieder von der Aktivität angezeigt und die letzte Nachricht in onPostExecute () wird angezeigt.

Code für die Aktivität:

%Vor%

AsyncTask-Code:

%Vor%     
Hesam 07.03.2012 09:38
quelle