2012-12-30 27 views
8

Ich habe eine asynctask, die etwas tut, wenn es fertig ist, will ich es übertragen, dass es getan ist.Senden von Broadcasts von asynctasks

Normalerweise würde ich tun: context.sendBroadcast(new Intent(MYINTENT)); jedoch hat asynctask keinen Kontext. Ich habe einige Antworten auf diese Fragen gesehen, die vorschlagen, einen Verweis auf den Kontext der App-Aktivität an die Asynctask zu senden. aber diese Referenz ist schlecht, wenn der Benutzer den Bildschirm dreht. und die manuelle Pflege der Referenz ist eine schlechte Lösung (erfordert zu viel von der Aktivität, die die asynctask erzeugt, die ich nicht kontrolliere). Jetzt sind die Fragen:

1) Warum ist Android so eingerichtet? Warum benötige ich sogar einen Kontext, um eine Sendung zu senden, wenn Sendungen für andere Kontexte registriert und bearbeitet werden können?

2) Gibt es eine gute Lösung für dieses Problem? (Gut = benötigt so wenig wie möglich von der Aktivität, die die Asyntask erzeugt, überlebt Rotationen, etc ..).

+1

Übergeben Sie den Anwendungskontext mit 'Activity.getApplicationContext()' an den 'AsyncTasnk'. Der Anwendungskontext wird von der Bildschirmdrehung nicht beeinflusst, was bedeutet, dass der Verweis darauf nach einer möglichen Rotation noch gültig ist. – Paul

+0

@Paul gut, dass das technische Problem löst, danke. Ich frage mich immer noch, warum ich sogar einen Kontext brauche, um Sendungen zu senden (von einem Designstandpunkt aus). – Oren

Antwort

16

Der Kontext, den Sie gerade in Ihrer AsyncTask verwenden, ist der Kontext Ihrer aktuellen Aktivität. Standardmäßig wird eine Bildschirmdrehung die aktuelle Instanz dieser Aktivität zerstören und eine neue erstellen. Dies ist (auch wenn es zunächst nicht so scheint) beabsichtigtes Verhalten. Der Grund dafür ist, dass Sie möglicherweise unterschiedliche Ressourcen (Layouts, Zeichenvorlagen usw.) für unterschiedliche Bildschirmausrichtungen verwenden möchten. Um diese potenziell unterschiedlichen Ressourcen zu verwenden, erstellt Android die Aktivität bei jeder Rotation neu.

Sie können dem entgegenwirken, indem Sie das android:configChanges Attribut in Ihrer AndroidManifest.xml Datei setzen, aber in Ihrem Fall wird diese Lösung nicht empfohlen.

Der richtige Weg, um mit diesem Problem umzugehen, besteht darin, den Anwendungskontext an die AsyncTask anstelle Ihrer Aktivität zu übergeben (Activity erbt von Context). Sie können das tun, indem Sie getApplicationContext() von der Instanz Ihrer Aktivität aufrufen. Ihr Anwendungskontext behält Ereignisse wie Bildschirmrotation und Leben, bis das System die App zum Absturz bringt.

Wie, warum Sie eine Instanz von Context müssen grundlegende Aufgaben:

Schnittstelle zu globalen Informationen über eine Anwendungsumgebung. Diese ist eine abstrakte Klasse, deren Implementierung von dem Android System zur Verfügung gestellt wird. Es ermöglicht den Zugriff auf anwendungsspezifische Ressourcen und Klassen sowie up-Anrufe für Application-Level-Operationen wie Abschussaktivitäten, den digitalen Rundfunk und Empfangen von Absichten usw.

Dies ist, wie die offizielle Dokumentation a definiert Context. Vielleicht kann jemand das besser erklären, aber für mich ist diese Definition ausreichend.

Verwandte Themen