Senden von Broadcasts von asynctasks

8

Ich habe eine asynctask, die etwas tut, wenn es fertig ist, möchte ich, dass es fertig ist.

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 brauche ich sogar einen Kontext, um eine Broadcast zu senden, wenn Broadcasts 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 ..).

    
Oren 30.12.2012, 11:23
quelle

1 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 potentiell unterschiedlichen Ressourcen anzuwenden, erstellt Android die Aktivität bei jeder Rotation neu.

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

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

Warum Sie eine Instanz von Context für grundlegende Aufgaben benötigen:

  

Schnittstelle zu globalen Informationen über eine Anwendungsumgebung. Dies   ist eine abstrakte Klasse, deren Implementierung vom Android bereitgestellt wird   System. Es ermöglicht den Zugriff auf anwendungsspezifische Ressourcen und   Klassen sowie Up-Rufe für Vorgänge auf Anwendungsebene wie z   Starten von Aktivitäten, Senden und Empfangen von Absichten, etc.

So definiert die offizielle Dokumentation ein Context . Vielleicht kann jemand das besser erklären, aber für mich reicht diese Definition aus.

    
Paul 30.12.2012, 12:29
quelle

Tags und Links