2013-05-18 8 views
7

Voglio creare una classe Singleton che sarà richiamabile da tutti i punti della mia applicazione. Il problema è che questa classe avrà bisogno di un contesto per le sue operazioni.Singleton con contesto in Android

Non voglio ricreare il singleton in ogni attività perché in questo modo perde ogni senso, quindi ho pensato di crearlo nel mio MainActivity, con un metodo init in cui passo il contesto come argomento. Da quel momento in poi, il mio Singleton sarebbe utilizzabile, ma penso che questo sia un cattivo design perché in questo modo il mio riferimento MainActivity sarà sempre mantenuto e quindi potrei incorrere in perdite di memoria.

Sono qui?

+2

Se il mio oggetto Singleton è statico e ho un riferimento al contesto, tale contesto non viene mai raccolto. Se non sbaglio, ciò potrebbe causare una perdita di memoria. Se questo non è il tuo caso, per favore espandi un po 'la tua risposta. – MichelReap

+0

Perdite di memoria * plurale *? Se si tratta di un singleton, esiste un unico riferimento alle sue variabili di istanza. Come è questa una perdita, e anche se lo fosse, in che modo sarebbe * veramente * importante? –

+1

Bene, tutte le risorse mantenute nell'attività in cui inizio il mio Singleton si svolgeranno durante l'esecuzione dell'app. Se per esempio ho un'immagine grande lì, potrebbe facilmente riempire la mia memoria e presto potrei esaurire. – MichelReap

risposta

11

Hai ragione a non salvare il contesto dell'attività principale nel singleton a causa di perdite di memoria. Se hai bisogno di un contesto costante all'interno del tuo singleton, usa getApplicationContext(). Questo può essere salvato in sicurezza. Nota che questo contesto non è utilizzabile per la maggior parte delle funzioni relative alla gui. In rari casi è necessario il contesto del livello di attività all'interno di singleton, passare il contesto dell'attività di chiamata al metodo di singleton senza salvare

+0

Vuoi dire, se uso getApplicationContext() sul mio metodo init(), non otterrò problemi di perdita di memoria, mentre se passassi direttamente il riferimento all'attività (cioè init (this)), è allora che mi metterò nei guai? – MichelReap

+1

@MichelReap 'this' è più che * solo * un contesto. –

+0

Ok, immagino che questo fosse il bit di informazione che mi mancava. – MichelReap