2013-05-18 14 views
7

Ich möchte eine Singleton-Klasse erstellen, die von allen Punkten in meiner Anwendung aufgerufen werden kann. Das Problem ist, dass diese Klasse einen Kontext für ihre Operationen benötigt.Singleton mit Kontext in Android

Ich möchte nicht das Singleton in jeder Aktivität neu erstellen, weil auf diese Weise verliert alles Sinn, also habe ich darüber nachgedacht, es in meiner MainActivity mit einer Init-Methode zu erstellen, wo ich den Kontext als Argument übergeben. Von diesem Punkt an wäre mein Singleton brauchbar, aber ich denke, das ist ein schlechtes Design, weil meine MainActivity-Referenz immer so gehalten wird, und so könnte es zu Speicherlecks kommen.

Bin ich hier richtig?

+2

Wenn mein Singleton-Objekt statisch ist und ich einen Verweis auf den Kontext halte, wird dieser Kontext niemals als Garbage-Collection behandelt. Wenn ich mich nicht irre, könnte dies zu einem Speicherverlust führen. Wenn dies nicht der Fall ist, erweitern Sie bitte ein wenig auf Ihre Antwort. – MichelReap

+0

Speicherlecks * Plural *? Wenn es ein Singleton ist, dann gibt es einen einzigen Verweis auf seine Instanzvariablen. Wie ist das ein Leck, und selbst wenn es so wäre, wie würde es eigentlich * eine Rolle spielen? –

+1

Nun, alle in der Aktivität, in der ich meinen Singleton starte, aufbewahrten Assets werden während der Ausführung der App gehalten. Wenn ich zum Beispiel dort ein großes Bild habe, könnte es leicht mein Gedächtnis füllen und ich könnte bald davon ausgehen. – MichelReap

Antwort

11

Sie haben keinen Recht, den Hauptaktivitätskontext aufgrund von Speicherlecks in den Singleton zu speichern. Wenn Sie in Ihrem Singleton einen konstanten Kontext benötigen, verwenden Sie getApplicationContext(). Dies kann sicher gespeichert werden. Beachten Sie jedoch, dass dieser Kontext für die meisten GUI-bezogenen Funktionen nicht verwendbar ist. In seltenen Fällen benötigen Sie Aktivitätskontexte innerhalb von Singleton, übergeben Sie aktive Aktivitätskontexte an Singletons Methode, ohne zu speichern

+0

Sie meinen, wenn ich getApplicationContext() auf meine init() -Methode verwende, bekomme ich keine Speicherleckprobleme, während, wenn ich die Aktivitätsreferenz direkt übergebe (d. H. Init (this)), werde ich dann in Schwierigkeiten geraten? – MichelReap

+1

@MichelReap 'this' ist mehr als * nur * ein Kontext. –

+0

Okay, ich denke, das war die Information, die mir fehlte. – MichelReap