2013-05-18 16 views
7

Chcę utworzyć klasę Singleton, która będzie można wywoływać ze wszystkich punktów w mojej aplikacji. Problem polega na tym, że ta klasa będzie potrzebować kontekstu dla swoich operacji.Singleton z kontekstem w Androidzie

Nie chcę odtwarzać singletonu w każdym działaniu, ponieważ w ten sposób traci sens, więc pomyślałem o stworzeniu go w mojej MainActivity, z metodą init, w której przekazuję kontekst jako argument. Od tego momentu mój Singleton byłby użyteczny, ale myślę, że jest to zły projekt, ponieważ w ten sposób moje odwołanie do MainActivity będzie zawsze trzymane, a tym samym mogę napotkać wycieki pamięci.

Czy jestem tutaj?

+2

Jeśli mój obiekt Singleton jest statyczny, a ja trzymam odnośnik do kontekstu, wówczas ten kontekst nie jest nigdy zbiorem śmieci. Jeśli się nie mylę, może to spowodować wyciek pamięci. Jeśli tak nie jest, rozwiń trochę odpowiedź. – MichelReap

+0

Wycieki pamięci * liczba mnoga *? Jeśli jest to singleton, to istnieje jedno odniesienie do jego zmiennych instancji. Jak to jest przeciekiem, a nawet gdyby tak było, jak to by w rzeczywistości miało znaczenie? –

+1

Cóż, wszystkie zasoby przechowywane w działalności, w której uruchamiam Singleton, będą przechowywane przez cały czas wykonywania aplikacji. Gdybym na przykład miał tam wielki obraz, mógłby z łatwością wypełnić moją pamięć i wkrótce mógłbym z niej skończyć. – MichelReap

Odpowiedz

11

Masz rację, aby nie zapisywać głównego kontekstu działania w singleton ze względu na wycieki pamięci. Jeśli potrzebujesz stałego kontekstu w swoim singletonie, użyj getApplicationContext(). Można to bezpiecznie zapisać. Należy jednak pamiętać, że ten kontekst nie jest dostępny dla większości funkcji związanych z GUI. W rzadkich przypadkach potrzebny jest kontekst poziomu aktywności w singleton, przekazywanie kontekstu aktywności wywołania do metody singletona bez zapisywania

+0

Masz na myśli, jeśli użyję metody getApplicationContext() w mojej metodzie init(), nie dostanę problemów z przeciekami pamięci, natomiast jeśli przekażę odwołanie do działania bezpośrednio (tj. Init (this)), wtedy będę miał kłopoty? – MichelReap

+1

@MichelReap 'this' to więcej niż * tylko * kontekst. –

+0

Okej, zgaduję, że to była informacja, której mi brakowało. – MichelReap