2010-03-19 12 views
54

In Android, si stanno utilizzando le variabili statiche come pratica consigliata? per esempio, l'implementazione di un pattern Singleton in Java, faccio di solito:Utilizzo di variabili statiche in Android

private static A the_instance; 
public static A getInstance() { 
    if (the_instance == null) { 
     the_instance = new A(); 
    } 
    return the_instance; 
} 

Inoltre, quando fa questo vengono ripulite dalla JVM Android?

Grazie.

+0

Credo che sarà necessario un blocco per la sincronizzazione per la classe singleton, altrimenti si avranno più oggetti nella memoria heap in uno scenario multi-thread. – shanwu

risposta

61

static i campi sono collegati all'istanza Class nel suo complesso, che è a sua volta collegata allo ClassLoader che ha caricato la classe. the_instance verrebbe scaricato quando l'intero ClassLoader viene recuperato. Sono sicuro al 90% che ciò accada quando Android distrugge l'app (non quando va in background, o fa una pausa, ma è completamente spenta.)

Quindi, pensa che sia come vivere finché la tua app funziona. Singleton è una buona idea? Le persone hanno opinioni diverse. Penso che vada bene se usato in modo appropriato, me stesso. Non penso che la risposta cambi molto su Android. L'utilizzo della memoria non è il problema di per sé; se hai bisogno di caricare un sacco di cose in memoria, questo è un problema o non lo è, indipendentemente dal fatto che tu incapsuli i dati in un Singleton.

+4

Confermato, verrà mantenuto fino alla distruzione dell'intero processo. Quando il tuo processo sarà rianimato, riapparirà il tuo singleton! –

+13

Si noti che il singleton verrà ricreato, ma lo stato originale del singleton non viene ripristinato automaticamente. Questo dovrebbe essere fatto manualmente. –

+0

@Kevin Puoi elaborare il tuo commento? –

0

Non sono sicuro che tale approccio sia valido per la piattaforma mobile in cui è disponibile una memoria limitata. Per non parlare del fatto che l'applicazione verrà eseguita su un dispositivo abilitato multi-tasking.

Penso che questo approccio possa incidere la memoria dal dispositivo, ma non ho documenti per supportare questo. Forse qualcuno che è più istruito di me può condividere i loro pensieri.

+0

Non penso che questo potrebbe effettivamente essere un problema poiché il DVM gestisce abbastanza bene la sua memoria. –

-4

No. Non farlo! Singleton is an anti-patern!. Al contrario, utilizzare l'integrazione delle dipendenze, tramite un framework (ad esempio tramite Dagger o Roboguice) o passando esplicitamente l'oggetto istanziato.

+36

Ricorda che il team principale di Android sostiene l'uso del tuo "anti-pattern" e che Google Guice sembra richiedere circa 800 KB di JAR, il che è negativo per un'app mobile. – CommonsWare

+5

Guice è fantastico, ma potrebbe essere eccessivo per molte applicazioni. Ma se hai intenzione di immergerti in Guice, dai un'occhiata a questo bel progetto: http://code.google.com/p/roboguice/ –

+3

La roba per le dipendenze porta complessità. Ho visto alcuni sviluppatori passare ore a scoprire perché gli oggetti sbagliati sono stati iniettati. Singleton ha i suoi valori! – yonexbat

15

Penso che le variabili statiche siano OK.

Questo è ciò che Android doc dice:

http://developer.android.com/guide/appendix/faq/framework.html

Come faccio a passare i dati tra Attivita/Servizi all'interno di una singola applicazione?

un campo statico pubblico/metodo

Un modo alternativo per rendere i dati accessibili attraverso Attivita/Servizi è quello di utilizzare i campi e/o metodi statici pubblici. Puoi accedere a questi campi statici da qualsiasi altra classe nella tua applicazione. Per condividere un oggetto, l'attività che crea il tuo oggetto imposta un campo statico per puntare a questo oggetto e qualsiasi altra attività che voglia utilizzare questo oggetto accede semplicemente a questo campo statico.

+8

Associazione, callback/ascoltatori, ma non statica –

+1

Avete sentito parlare di intenti? i campi statici sono una cattiva pratica, tendono ad accoppiarsi strettamente ... – AnixPasBesoin

+1

Puoi per favore ragazzi fornire una soluzione adeguata per me? Con le variabili statiche sto affrontando un problema quando l'app viene dallo sfondo o rimane aperta per molte ore, si blocca. Con l'intento è molto difficile passare oggetti. Allora, qual è il modo corretto per farlo? –

Problemi correlati