Nebenläufigkeit unter Android

20 Feb

Die Programmierung für Android erweist sich im Großen und Ganzen als relativ simpel – Das SDK bietet eine große Menge an Bibliotheken und API Aufrufe sodass das Rad nicht ständig neu erfindet werden muss. Eine kleine Applikation kann demnach den Ablauf von der Planung zum Release in einem hohen Tempo durchlaufen, wobei wichtige Aspekte wie Nebenläufigkeit vielleicht gänzlich ignoriert werden. Dies kann wiederum zu einem Application Not Responding (ANR) führen, indem der Benutzer die Möglichkeit hat das Programm zu schließen. Das auszuführende Programm wird im UI-Thread ausgeführt. Er ist für die Anzeige der Displayelemente (Views) verantwortlich und reagiert auf Benutzerinteraktionen. Wenn dieser Thread nun durch lang andauernde Operationen wie I/O (Netzwerk) oder lang andauernde Berechnungen blockiert wird, bekommt der Benutzer die ANR Meldung angezeigt. Ab Android 3 führen Netzwerkverbindungen, die im UI-Thread ausgeführt werden, zu einer Exception zur Laufzeit. Dem Entwickler werden dabei zwei Ansätze zur Lösung angeboten.

Der Benutzer hat grundsätzlich die Möglichkeit die aus Java bekannten Threads oder AsyncTasks zu verwenden. Ein Thread eignet sich dabei hervorragend wenn das User Interface nicht verändert werden soll. Falls dies jedoch das Ziel ist, müssen Android spezifische Klassen zur Hilfe genommen werden. Zum einen gibt es die Klasse Handler. Dabei muss die jeweilige Activity ein neues Objekt der Klasse android.os.Handler erzeugen und deren Methode handleMessage() überschreiben. In der Methode wird angegeben wie die Activity mit dem Ergebnis der nebenläufigen Operation umgehen soll. Die nebenläufige Operation selbst bekommt eine Referenz auf diesen Handler und kann über die Klasse Bundle Objekte speichern, die über die sendMessage() Methode des Handlers an den Handler der Activity gesendet werden.

Zum anderen gibt es die Klasse AsyncTask, die aus verschiedenen Methoden besteht, die überschrieben werden müssen. Die nebenläufige Operation muss in der Methode doInBackground() implementiert werden. Beispielsweise kann damit eine Grafik aus dem Internet geladen werden, die automatisch an die Methode onPostExecute() weitergeleitet wird.  Da die Methode im UI Thread gestartet wird, kann sie dort verwendet werden.

Weiterführende Links:

http://developer.android.com/resources/articles/painless-threading.html

http://www.vogella.de/articles/AndroidPerformance/article.html

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: