en / de
Dienstleistungen
Referenzen
Jobs & Karriere
Über uns
Media Center
Blog Kurse/Academy Presse Jobs

Eine Lanze für android.app.Application brechen


Aber stimmt das so? Oder gibt es doch Fälle in denen es sinnvoll wäre android.app.Application zu nutzen?

Der zweite Teil ist schon korrekt. Ich habe nichts gegen Singletons an sich. Und sie zu nutzen um die Modularisierung der Applikation zu erhöhen ist bestimmt eine gute Idee.

Die Probleme

Aber Singletons haben ein Problem: Sie müssen initialisiert werden. Und das kann recht kniffelig werden.

Der übliche Weg der späten Initialisierung hat recht große Nebenläufigkeitsprobleme. Zu diesem Thema gibt es ausreichend Informationen und Vorschläge, wie man sie teilweise mit komplizierten Techniken wie Doppel-Locking bewältigen kann.

Zudem braucht die getInstance ()-Methode mit großer Wahrscheinlichkeit einen android.content.Context als Parameter. Was gleichzeitig den Aufruf kompliziert und Fehleranfällig macht. Es bedarf nur eines Programmierers im Team, der eine android.app.Activity (aka this) für das getInstance () nutzt und schon hat man sowohl ein Speicherloch als auch einen schwer zu findenden sporadischen Absturz.

Zur Erinnerung: Selbst wenn die App nur eine einzige android.app.Activity hat — sie wird zerstört und neu erstellt wenn das Gerät gedreht wird. Man kann zwar das Neu-Erstellen verhindern, aber dies macht den gesamten Rotationsablauf komplizierter und fehleranfälliger. Man sollte dies wirklich nur dann machen wenn es keine anderer Alternative gibt.

Alternativ könnte man die Singletons im onCreate der Hauptaktivität erstellen. Damit löst man die Probleme der Nebenläufigkeit und verbessert die Lesbarkeit des Codes. Auch kann man durch Verwendung separater createInstance ()-Methoden um die Verwendung eines context-Parameters bei getInstance ()-Methoden herumkommen. Allerdings hat auch dieses Vorgehen ein Problem: Es es gibt viele Fälle bei dem gar keine Activity erstellt wird: android.content.BroadcastReceiver, android.app.Service oder Instrumentation-Tests. Besonders Tests sind ein Problem: Instrumentation-Tests können alle Instanzen außer der Reihe erstellen

Initialisieren in allen Activities und Receivern? Klinkt kompliziert und wiederum Fehleranfällig.

Die Lösung

Aber wir müssen es uns gar nicht so schwer machen. Es gibt ja android.app.Application.onCreate (). Diese Methode wird garantiert nur einmal vor allen anderen Funktionen aufgerufen, dadurch können Probleme mit der Nebenläufigkeit nicht mehr auftauchen – ein if (!initialised) ist nicht mehr nötig. Alle Initialisierungen werden in der korrekten Reihenfolge durchgeführt und this ist ein context, der garantiert so lange gültig ist wie der Prozess läuft.

Um Missverständnisse von vorn herein auszuräumen: Ich sage nicht, dass man android.app.Application verwenden soll um die Singletons zu ersetzten. Das würde zum God-Object Anti-Pattern führen. Die zu initialisierenden Daten sollten auch weiterhin separat gehalten werden.

Zum guten Schluss kann man, wenn nötig, für die Instrumentation-Tests eine MockApplication-Klasse erstellen, welche die Singletons mit Mock-Objekten befüllt.

JOBS
NACH OBEN
Ihre persönlichen Kontakte Ihre Fragen an unseren Verkauf Haben Sie Ideen, Visonen, Herausforderunge oder Projekte?
Kontaktieren Sie unsere Ansprechpersonen!
WINTERTHUR
Marco Tölle Business Developer, Sales +41 52 303 55 31
Christoph Pfister Leiter Business Unit Media +41 52 303 55 22
Boris Zeltner Sales +41 52 234 56 16
Daniel Brüngger Filialleiter Winterthur, Mitglied der Geschäftsleitung +41 52 234 56 42
Michael Eisenring Leiter Business Unit Embedded +41 52 234 56 14
Martin Straumann Leiter Business Unit Health, Mitglied der Geschäftsleitung +41 52 234 56 17
Halm Reusser Business Developer, Sales +41 52 303 55 41
Marta Goldmann Sales Support, Assistentin Filialleiter Winterthur, Administration +41 52 234 56 60
LUZERN
Markus Märki Filialleiter Luzern, Mitglied der Geschäftsleitung +41 41 455 66 08
Denis Druzic Stv. Filialleiter Luzern, Leiter Business Unit Projekte +41 41 455 66 24
Dominique Portmann Leiter Business Unit Test Engineering +41 41 455 66 05
Martin Hofstetter Business Developer, Sales +41 52 303 55 15
Niels Jäckel Projekte +41 41 455 66 18
BERN
Markus Märki Filialleiter Bern, Mitglied der Geschäftsleitung +41 41 455 66 08
Stephan Marti Stv. Filialleiter Bern, Leiter Business Unit Software Services +41 31 917 45 11


Ihre Fragen an unsere Experten Sind sie auf der Suche nach spezifischen Themen finden Sie hier Ihren direkten Ansprechpartner.
WINTERTHUR
Patrick Schättin Experte für Automotive +41 52 234 56 34
Christoph Pfister Leiter Business Unit Media +41 52 303 55 22
Martin Straumann Leiter Business Unit Health, Mitglied der Geschäftsleitung +41 52 234 56 17
Michael Eisenring Leiter Business Unit Embedded +41 52 234 56 14
Lukas Naef Leiter Business Unit Application Development +41 52 234 56 21
Mark Allibone Experte für Mobile +41 52 234 56 49
Ramona Engel Leiterin HR/Administration, Assistentin CEO +41 52 234 56 55
LUZERN
Dominique Portmann Leiter Business Unit Testing +41 41 455 66 05
Denis Druzic Leiter Business Unit Projekte +41 41 455 66 24
Elio Lüthi Leiter National Instruments Technologien +41 41 455 66 35
Andreas Schicker Leiter Marketing, Kommunikation und Presse +41 52 234 56 75
BERN
Stephan Marti Leiter Business Unit Software Services +41 31 917 45 11
Lukas Anliker Experte für Microsoft +41 31 917 45 18


Ihre Fragen an unsere Administration Wissen Sie nicht so recht wohin mit Ihrer Frage, dann kontaktieren Sie doch einfach unsere
„Stimmen am Telefon“. Sie helfen sehr gerne weiter.
WINTERTHUR
Marta Goldmann Sales Support, Assistentin Filialleiter Winterthur, Administration +41 52 234 56 60
Tamara Insua Lernende Administration +41 52 303 55 05
Alessia Meier Lernende Administration +41 52 303 55 46
Kemal Suter Lernender Administration +41 52 303 55 09
LUZERN
Dusanka Sucur Assistentin Filialleiter Luzern, Administration +41 41 455 66 03
BERN
Myriame Rauber Administration +41 31 339 98 11
MÜNCHEN
Ramona Engel Leiterin HR/Administration, Assistentin CEO +41 52 234 56 55
LUZERN
BERN
MÜNCHEN
Dusanka Sucur Assistentin Filialleiter Luzern, Administration +41 41 455 66 03
Myriame Rauber Administration +41 31 339 98 11
Ramona Engel Leiterin HR/Administration, Assistentin CEO +41 52 234 56 55


Unser Management Gemeinsam wollen wir nachhaltig Ihr Geschäftsziel erreichen – we know how
WINTERTHUR
Geri Moll CEO +41 52 234 56 36
Daniel Brüngger Filialleiter Winterthur, Mitglied der Geschäftsleitung +41 52 234 56 42
Martin Straumann Leiter Business Unit Health, Mitglied der Geschäftsleitung +41 52 234 56 17
LUZERN
Markus Märki Filialleiter Luzern, Mitglied der Geschäftsleitung +41 41 455 66 08
BERN
Markus Märki Filialleiter Luzern, Mitglied der Geschäftsleitung +41 41 455 66 08
MÜNCHEN
Geri Moll CEO +41 52 234 56 36
LUZERN
BERN
MÜNCHEN
Markus Märki Filialleiter Luzern, Mitglied der Geschäftsleitung +41 41 455 66 08
Markus Märki Filialleiter Bern, Mitglied der Geschäftsleitung +41 41 455 66 08
Geri Moll CEO +41 52 234 56 36

Niederlassungen

SCHWEIZ
Winterthur Rudolf-Diesel-Strasse 3, CH-8404 Winterthur +41 52 234 56 11, [email protected]
Luzern Platz 4, CH-6039 Root D4 +41 41 455 66 11, [email protected]
Bern Galgenfeldweg 18, CH-3006 Bern +41 31 917 45 11, [email protected]
DEUTSCHLAND
München Bernabeistr. 1, c/o Steuerkanzlei Schneider Gerald DE-80639 München +49 6252 67 4455, [email protected]

Kontaktformular

Sie haben Fragen?

Füllen Sie folgendes Formular aus, wir werden uns umgehend bei Ihnen melden.

Ihr Noser Engineering Team.

Das möchte ich herunterladen

Füllen Sie folgendes Formular aus.

Ihr Noser Engineering Team.

Das möchte ich bestellen

Füllen Sie folgendes Formular aus.

Ihr Noser Engineering Team.

Da melde ich mich an

Füllen Sie folgendes Formular aus.

Ihr Noser Engineering Team.