Wir benutzen Cookies um für Sie eine möglichst grosses Benutzererlebnis zu gewährleisten. Indem Sie diese Website nutzen, erklären Sie sich mit der Verwendung von Cookies einverstanden. Die Einstellungen dazu können Sie jederzeit ändern. Weitere Informationen.
OK
en / de
Dienstleistungen
Referenzen
Jobs & Karriere
Über uns
Blog News Kurse/Academy Download 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.

NACH OBEN
Ihre persönlichen KontakteIhre Fragen an unseren VerkaufHaben Sie Ideen, Visonen, Herausforderungen oder Projekte?
Kontaktieren Sie unsere Ansprechpersonen!
WINTERTHUR
Marco TölleBusiness Developer, Sales Manager+41 52 303 55 31
Boris ZeltnerSenior Sales Manager+41 52 234 56 16
Daniel BrünggerFilialleiter Winterthur+41 52 234 56 42
Dr. Michael EisenringBusiness Unit Leiter Embedded Systems+41 52 234 56 14
Halm ReusserBusiness Developer, Sales Manager+41 52 303 55 41
Marta GoldmannAssistentin Leitungsteam+41 52 234 56 60
LUZERN
Markus MärkiFilialleiter Luzern+41 41 455 66 08
Denis DruzicStv. Filialleiter Luzern, Business Unit Leiter Projektmanagement+41 41 455 66 24
Niels JäckelProjektleiter+41 41 455 66 18
BERN
Markus MärkiFilialleiter Bern+41 41 455 66 08
Stephan MartiStv. Filialleiter Bern, Business Unit Leiter Software Services+41 31 917 45 11
Cédric RoserensAccount Manager+41 31 917 45 11


Ihre Fragen an unsere ExpertenSind sie auf der Suche nach spezifischen Themen finden Sie hier Ihren direkten Ansprechpartner.
WINTERTHUR
Dr. Michael EisenringBusiness Unit Leiter Embedded Systems+41 52 234 56 14
Patrick SchättinBusiness Unit Leiter Application Development+41 52 234 56 34
Oliver VollBusiness Unit Leiter Application Development+41 52 234 56 51
Mark AlliboneExperte für Mobile+41 52 234 56 49
Ramona Engel PaintnerLeiterin HR/Administration, Assistentin CEO+41 52 234 56 55
Andreas SchickerLeiter Marketing+41 52 234 56 75
LUZERN
Denis DruzicStv. Filialleiter Luzern, Business Unit Leiter Projektmanagement+41 41 455 66 24
Elio LüthiLeiter NI Technologien+41 41 455 66 35
Andreas SchickerLeiter Marketing+41 52 234 56 75
BERN
Stephan MartiStv. Filialleiter Bern, Business Unit Leiter Software Services+41 31 917 45 11
Lukas AnlikerService Manager+41 31 917 45 11
Andreas SchickerLeiter Marketing+41 52 234 56 75


Ihre Fragen an unsere AdministrationWissen Sie nicht so recht wohin mit Ihrer Frage, dann kontaktieren Sie doch einfach unsere
„Stimmen am Telefon“. Sie helfen sehr gerne weiter.
WINTERTHUR
Marta GoldmannAssistentin Leitungsteam+41 52 234 56 60
Tamara InsuaLernende Administration+41 52 234 56 11
Kemal SuterLernender Administration+41 52 303 55 09
LUZERN
BERN
MÜNCHEN
Dusanka SucurAssistentin Leitungsteam+41 41 455 66 11
Myriame RauberAdministration+41 31 339 98 11
Ramona Engel PaintnerLeiterin HR/Administration, Assistentin CEO+41 52 234 56 55
LUZERN
Dusanka SucurAssistentin Leitungsteam+41 41 455 66 11
BERN
Myriame RauberAdministration+41 31 339 98 11
MÜNCHEN
Ramona Engel PaintnerLeiterin HR/Administration, Assistentin CEO+41 52 234 56 55


Unser ManagementGemeinsam wollen wir nachhaltig Ihr Geschäftsziel erreichen – we know how
Geri MollCEO+41 52 234 56 36
Daniel BrünggerFilialleiter Winterthur+41 52 234 56 42
Markus MärkiFilialleiter Luzern/Bern+41 41 455 66 08


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.

* Pflichtfeld

Das möchte ich herunterladen

Füllen Sie folgendes Formular aus.

Ihr Noser Engineering Team.

* Pflichtfeld

Das möchte ich bestellen

Füllen Sie folgendes Formular aus.

Ihr Noser Engineering Team.

* Pflichtfeld