2010-05-26 7 views
21

Ist es eine schlechte Übung, den Kontext an einen Konstruktor zu übergeben und ihn als private Variable für die interne Verwendung zu speichern? Die andere Option besteht darin, den Kontext als Parameter an Methoden zu übergeben, die ihn benötigen.Aktivitätskontext an Konstruktoren übergeben, die intern verwendet werden sollen - ist das falsch?

Welche ist eine bessere Option? Ich habe das Gefühl, dass die Übergabe an den Konstruktor versehentlich zu Speicherlecks führen kann.

+0

Vielen Dank, dass Sie dieses Problem sogar angesprochen haben! Ich habe es gemacht, ohne Speicherlecks wirklich in Betracht zu ziehen. – HXCaine

Antwort

11

Oft ist alles, was Sie brauchen, ist die ApplicationContext, so was Sie tun können ist pass this.getApplicationContext() statt nur this. Ihr App-Kontext ist ohnehin für die gesamte Lebensdauer der App vorhanden, daher handelt es sich nicht um ein Speicherleck.

+0

Eigentlich möchte ich nur getResources() benutzen, damit das in meinem Fall funktioniert, oder? – jax

+0

Sicher, wenn das alles ist, was Sie brauchen. – JRL

+7

Bitte verwenden Sie nicht getApplicationContext(), es sei denn, Sie wissen wirklich, dass es das ist, was Sie wollen. Die Hauptsituation, die Sie verwenden werden, ist für globale Objekte, die unabhängig von einer bestimmten Aktivität sind. Bei Objekten, die einer bestimmten Aktivität zugeordnet sind, empfiehlt es sich in der Regel, den Kontext dieser Aktivität zu verwenden. (Und für diejenigen, die sich an den Kontext in einer privaten Variablen halten, ist in Ordnung, solange Sie keine anderen globalen Objekte haben, die einen Verweis darauf enthalten und somit ein Leck verursachen.) – hackbod

9

Es hängt von der Lebensdauer Ihres Objekts ab. Wenn Sie sicher sind, dass das Objekt nur intern von Ihrer Aktivität verwendet wird, wäre es OK, den Kontext an den Konstruktor zu übergeben. Anderenfalls übergeben Sie den Kontext nicht.

Wenn ein Objekt einen Verweis auf den Kontext hat Dadurch wird verhindert, dass die Aktivität "Garbage Collected" erfasst wird, und da eine Aktivität Verweise auf alle ihre Ansichten enthält, bedeutet dies, dass sehr schnell sehr viel Speicher ausgeleert werden kann.

Es ist leicht, sich hier heraus zu finden, da Dinge wie Gerätedrehungen dazu führen, dass Aktivitäten neu erstellt werden und es leicht ist, sich an einem Objekt festzuhalten, ohne es zu merken.

Es ist also wahrscheinlich am besten, auf der sicheren Seite zu sein und den Kontext zu übergeben, wenn Sie ihn brauchen.

+5

Dies ist nur dann der Fall, wenn das Objekt, das auf Ihren Kontext verweist, statisch oder zumindest von einem anderen Objekt gehalten wird, das die Aktivität überlebt. –

1

Deklarieren Sie in der Hauptanwendung (die gestartet wird) eine Variable appContext: "public static Context appContext;" Weisen Sie dann in der onCreate() - Methode für diese Hauptanwendung Folgendes zu: "appContext = this;" Da appContext öffentlich ist, kann jede andere Klasse in diesem Paket appContext verwenden, um die XML-Ressourcen aufzuspüren. Ist das besser (aus Speicherstandpunkt)?

Noch besser könnte es sein, das Resources-Objekt in der Hauptanwendung als statisch öffentlich zu deklarieren und es dann woanders zu verwenden, da die Ressourcen alles sind, was Sie brauchen.

Verwandte Themen