Ich verwende eine AsyncTask in meiner Aktivität. Sieht so aus:
%Vor%Wenn also der Benutzer das Gerät dreht, wird onPause () aufgerufen, aber ich möchte die Aufgabe nicht einfach abbrechen. Ich weiß, dass es eine Möglichkeit gibt, dem System zu sagen, dass es meine Aktivität bei der Rotation nicht wirklich zerstören soll, aber ist das für dieses Problem zu empfehlen? Soll ich stattdessen die AsyncTask in eine statische globale Klasse einfügen, die nicht an die Aktivität gebunden ist?
Danke
Dies fügt Daniels Antwort hinzu, aber es sind mehr Charaktere, als ich in einen Kommentar einfügen kann.
Meistens möchte ich, wenn ich eine AsyncTask verwende, einen Dialog drehen, und das ist absurd. Sie müssen etwas sehr ähnlich wie die Lösung in dem Thread tun, mit dem Daniel verknüpft ist.
Das Grundprinzip besteht darin, dass das Task-Objekt einen expliziten Verweis auf seinen übergeordneten Knoten enthält. Halten Sie das Task-Objekt über Bildschirmdrehungen hinweg (mit onRetainNonConfigurationInstance) und dann in onCreate, stellen Sie sicher, dass, wenn der Task vorhanden ist und Sie von einer Bildschirmdrehung kommen, die übergeordnete Aktivität der Task auf die neue Instanz setzt. Stellen Sie in der Aufgabe sicher, dass alle Aktivitätsmethoden für das explizite Elternelement aufgerufen werden.
Sie können hier ein Beispiel sehen, wie ich dies auf einer einfachen ListActivity mache: Ссылка
Eine Sache, die ich anders machen würde als in diesem Beispiel, ist, dass ich so viel von der Aufgabe onPostExecute der Aufgabe in eine Methode auf der Aktivität verschiebe, nur aus Gründen der Sauberkeit des Codes.
Bevor ich in den Spaß einsteigen, der AsyncTask und Orientierungsänderungen ist, lass mich das zuerst fragen - musst du die AsyncTask in einer Variablen festhalten? Es gibt nicht viele Gründe, warum Sie dies tun müssen, da AsyncTask Callbacks eingebaut hat, so dass Sie Ihre AsyncTask nicht halten müssen (rufen Sie ihn nicht an, er ruft Sie an). Außerdem sollte Ihre AsyncTask auch während einer Orientierungsänderung weiterlaufen - sie befindet sich schließlich in einem anderen Thread.
Die einzige Zeit, die ich an AsyncTask halten musste, war, einen Fehler zu beheben, der auftritt, wenn Sie versuchen, ein Dialogfeld anzuzeigen, während die AsyncTask ausgeführt wird. Es gibt eine Lösung, aber es ist ziemlich eklig. Es gibt eine Menge Diskussionen über diese hier , wenn das Ihr Problem ist hineinlaufen.
Klicken Sie hier für einen tollen Thread, der in der android-developers
listserv mit einigen guten Informationen veröffentlicht wurde bei der Verarbeitung von Bildschirmübergängen oder eingehenden Anrufen während der Ausführung von AsyncTask
.
Es wurde von Mark Murphy aus Ссылка
geschriebenEr enthält einen Link zu einem seiner Projekte, das ein Bussystem für die Verarbeitung von Hintergrundthreads verwendet. Ссылка
Am Ende habe ich etwas implementiert, das diesem Beitrag in meiner Bewerbung sehr ähnlich sieht funktioniert super!
Wenn Sie es wirklich die ganze Zeit ausführen möchten: Ich verwende ein Singleton-Muster in meiner Klasse, das von AsyncTask erweitert wurde, und rufe es in onResume auf:
%Vor%Ich mache einfach nichts in onDestroy (ja, das heißt, wenn du drehst!) und diese Aufgabe läuft wirklich für immer ...
Der Singleton sieht so aus (nur Struktur, aber ich denke, du wirst es bekommen):
%Vor%Tags und Links android