14 Stimmen

Wenn die Anwendung während der Ausführung einer AsyncTask in den Hintergrund wechselt, was soll sie dann tun?

Ich habe eine Anwendung, die AsyncTasks verwendet, um Aufrufe an einen REST-Server zu tätigen.

Stellen Sie sich vor, dass der Benutzer während einer Ladephase (d.h. die AsyncTask geht zum REST-Server und holt Daten für den nächsten Bildschirm) auf Home drückt.

Was wird empfohlen:

  • Abbrechen der aktuellen AsyncTask(s) und Neustart bei Wiederaufnahme der Aktivität

oder

  • Setzen Sie die AsyncTasks fort, vermeiden Sie aber die startActivity, indem Sie prüfen, ob sich die Anwendung im Hintergrund befindet (um zu vermeiden, dass die neue Aktivität in den Vordergrund tritt, nachdem die Anwendung in den Hintergrund geschickt wurde). Und onResume Senden an die nächste Aktivität

Worst-Case-Szenarien, die Sie vorhersehen sollten:

  1. Die Anwendung geht in den Hintergrund und wird wegen Speichermangels beendet
  2. Die Asynctask schlägt aufgrund einer Zeitüberschreitung oder eines anderen REST-Fehlers fehl

Nach beidem geht der Nutzer zurück zur App...

0 Stimmen

Hängt von Ihren Anforderungen ab.<br>Wenn Sie fragen wollen, wie man eine der beiden Möglichkeiten, die Sie erwähnt haben, dann ist es ein anderer Fall.<br>Bitte sagen Sie, ob es das ist, was Sie brauchen.

0 Stimmen

Nein, ich weiß, wie man es umsetzt. Ich möchte wissen, ob eines der beiden Systeme empfehlenswerter ist und warum. Was sind die Probleme und Vorteile der einzelnen.

0 Stimmen

Wie ich schon sagte, hängt das von Ihren Anforderungen ab. 1. Stellt sicher, dass keine Aktion ausgeführt wird, nachdem die Aktivität angehalten wurde, und sorgt dafür, dass einige häufige Ausnahmen, die in solchen Fällen auftreten, abgefangen werden. 2. Erfordert etwas mehr Aufwand im Code und bei der Pflege der Statusvariablen und ist in Bezug auf die Erfahrung anspruchsvoller. Aber es gibt das Problem, dass Ausnahmen und/oder Unstimmigkeiten auftreten, wenn Android Ihre Aktivität aus dem Aktivitätsstapel entfernt hat. In diesem Fall wird Ihr Thread erneut geladen, obwohl er in der Vergangenheit ausgeführt wurde, weil die frühere Instanz von Android gelöscht wurde.

6voto

havexz Punkte 9470

Ich empfehle den Service, der AsyncTask verwenden sollte, um seine Arbeit zu erledigen. Service wird Ihre Aktivität von Orientierungsänderung oder Benutzer verlassen isolieren. AsycnTask wird von der UI-Thread blockiert werden zu isolieren. Aber stellen Sie sicher, Service zu beenden, wenn Sie mit REST api fertig sind.

So erhalten Sie das Beste von beidem. Auch wenn Sie die DB nicht als lokalen Cache verwenden, können Sie dies versuchen. Selbst wenn der Benutzer weggeht, speichert der Dienst die abgerufenen Daten in der DB und wenn der Benutzer zurückkommt, können Sie den Bildschirm schnell anzeigen.

EDIT: Ich möchte nur hinzufügen, IntentService sind einfach zu implementieren.

Versuchen Sie Design Patterns für REST-Clients auf Android von Google für eine ausführlichere Erklärung

3voto

SeanPONeil Punkte 3881

Die Verwendung von AsyncTasks kann bei einer Konfigurationsänderung sehr unübersichtlich werden. Aus persönlicher Erfahrung würde ich empfehlen, stattdessen den Weg über IntentService/ResultReceiver zu gehen.

Weitere Informationen finden Sie in diesem Beitrag:

Restful-API-Dienst

1voto

Dude Punkte 632

Ich vermute, Sie wollen wissen, welcher Weg aus Sicht der Nutzer besser ist. Meiner Erfahrung nach erwartet ein Nutzer, dass die App den Download im Hintergrund fortsetzt, denn wenn er auf "Home" drückt, möchte er normalerweise entweder zwischendurch andere Apps ansehen oder er hat die Taste unbeabsichtigt gedrückt und möchte so schnell wie möglich zu Ihrer App zurückkehren. Wenn ein Nutzer den Download abbrechen möchte, drückt er normalerweise die Zurück-Taste oder eine spezielle Taste zum Abbrechen, die sich irgendwo auf dem Bildschirm Ihrer App befindet. Da der Benutzer also normalerweise die App weiter benutzen möchte, ist es für Ihre App bequemer, das Herunterladen von Daten fortzusetzen und dem Benutzer die heruntergeladenen Daten hoffentlich bereits anzuzeigen, wenn er zu Ihrer App zurückkehrt.

Aus technischer Sicht würde ich keinen Dienst in Anspruch nehmen. Ich würde einfach die AsyncTask laufen lassen. Und im schlimmsten Fall, wenn die App zwischendurch beendet wird, geht die App automatisch in die Startaktivität über, wenn der Benutzer zur App zurückkehrt, da die App ohnehin neu gestartet wird. Für den Fall, dass die Asynctask fehlschlägt, kann man prüfen, ob die Daten erfolgreich heruntergeladen wurden und wenn nicht, die Startaktivität anzeigen. Dies lässt sich leicht umsetzen, indem man die heruntergeladenen Daten in einer Variablen speichert, deren Anfangswert null ist. Wenn die Variable nach dem Herunterladen immer noch Null ist, ist die AsyncTask fehlgeschlagen und man muss in die Startaktivität wechseln. Ich denke, dies ist eine ziemlich robuste Implementierung.

0voto

Guillermo Tobar Punkte 344

Das Herunterladen wird fortgesetzt, ebenso wie die Android Market-App, aber es wird eine Benachrichtigung mit der Option zum Abbrechen angezeigt. Sie können dies implementieren, indem Sie einen Dienst zum Herunterladen verwenden.

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