2011-10-12 23 views
14

Qualcuno può illuminarmi sulla sicurezza di una classe che detiene valori globali in Android?Una classe "Globals" con variabili statiche in Android è sicura?

Ecco un breve esempio di ciò che intendo:

public class Globals { 
    public static int someVariable = 0; 
    public static User currentUser = null; 
    public static Handler onLogin = null; 
} 

Poi da qualche parte in un Activity faccio la seguente:

Globals.someVariable = 42; 
Globals.currentUser = new User("John", "Doe"); 

devo fare affidamento su Globals.currentUser a più posti nel mio app come appena l'utente ha effettuato l'accesso, ma non sono sicuro se dovrei farlo, e anche se potessi usare un gestore come questo.

Ho letto ovunque che un'app per Android potrebbe essere uccisa in qualsiasi momento, significa che viene uccisa completamente o forse solo una parte di essa, quindi uccide solo la mia classe Globals?

O c'è qualche altro modo per memorizzare i dati disponibili a livello globale in modo sicuro, senza dover scrivere ogni cambio membro al database (in realtà, la mia classe User è un po 'più complessache in questo esempio. ;-)

Grazie per il vostro impegno!


Edit: Ok, ecco quello che ho finalmente fatto:

public class MyApp extends Application { 

    private static MyApp _instance; 

    public MyApp() { 
     super(); 
     _instance = this; 
    } 

    public static MyApp getContext() { 
     return _instance; 
    } 
    .... 
    private User _user = null; 
    public User getUser() { 
     if (_user == null) _user = new User(); 
     return _user; 
    } 
} 

quindi modificare il AndroidManifest.xml e aggiungere android:name=".MyApp" per il nodo application a dire l'applicazione per utilizzare la sottoclasse.

Finora tutto funziona correttamente e posso accedere facilmente all'attuale Context (ad esempio in SQLiteOpenHelper) chiamando MyApp.getContext().

+0

possibile duplicato di [È statico sicuro in Android?] (Http://stackoverflow.com/questions/1203434/is-the-static-safe-in-android) –

+0

@ z00l Non so se il tuo il secondo approccio è migliore del primo. Se è più facile per te mantenere il codice base in questo modo, bene. Ma Android non uccide (garbage-collect) variabili statiche globali solo perché l'applicazione è stata uccisa (e probabilmente riavviata con lo stesso stack di attività). Ricorda, Java è Java e Android è Android. La gestione delle applicazioni di Android non è necessariamente la stessa dell'allocazione di memoria di Java per le variabili statiche globali. –

risposta

8

Sarebbe meglio usare la classe Android Application. E 'pensata per memorizzare lo stato di applicazione globale

http://developer.android.com/reference/android/app/Application.html

Basta creare una sottoclasse e assicurarsi di aggiornare il file di manifesto per usare la vostra versione. Quindi puoi memorizzare tutto ciò che ti serve. Le attività hanno un metodo getApplication() che è possibile trasmettere alla classe per accedere all'implementazione

+7

Non sono convinto che l'utilizzo della classe Application sia particolarmente necessario. In quella pagina molto documentato afferma: "Non c'è normalmente alcun bisogno di creare una sottoclasse di applicazione. In più la situazione, single statiche in grado di fornire le stesse funzionalità in modo più modulare. Se il Singleton ha bisogno di un contesto globale (ad esempio per registrare riceventi per la radiodiffusione) , la funzione per recuperarlo può avere un contesto che utilizza internamente Context.getApplicationContext() quando si costruisce il singleton per la prima volta. " – Maximus

+0

Wow, la mia prima domanda e ho ottenuto una risposta soddisfacente entro due minuti ... Grazie mille, la tua risposta mi ha davvero aiutato (per quanto posso dire adesso). – z00l

+0

@Maximus - Molto vero. E 'davvero una questione di preferenza Credo che (la documentazione afferma prima che la classe ha lo scopo di mantenere lo stato globale ed è possibile fornire la propria implementazione) –

1

Il motivo è sconsigliato: si verificheranno problemi durante il test dell'unità.

Puoi spiegare come testare unitamente una classe che deve fornire "utenti" personalizzati diversi qui? Stai forzando una classe finta/falsa in "Utente" che probabilmente avrà un effetto incrociato su altri test o stai mettendo un (se) test nel tuo codice che diventa brutto rapidamente.

Con il passare del tempo la compilazione artificiale di questa classe per i test diventa più complessa e inizia ad avere relazioni e dipendenze.

Più semplicemente rende difficile testare una classe in isolamento.

È uno di quei modelli che un determinato programmatore non vede o non usa mai perché è stato bruciato - vedrai una via di mezzo.

+2

- 1, non risponde alla domanda. La domanda è "Una classe Globals con variabili statiche in Android è sicura?" – Pacerier

+0

Le informazioni aggiuntive sono valide solo se la domanda viene prima risposta. Prima rispondi alla domanda, quindi aggiungi qualsiasi informazione tu ritenga importante. Se non hai una risposta, inserisci un commento non una risposta, in modo che la domanda ** senza risposta ** acquisisca maggiore visibilità e abbia una maggiore possibilità di risposta. La domanda ** avrebbe avuto risposta ** se tu e Andrew non avete postato i vostri commenti usando la casella di risposta. Ora abbiamo una domanda senza risposta per 3 anni e potenziali answerers non arrivare a vederli perché non appaiono in http://stackoverflow.com/unanswered – Pacerier

+0

Chiaramente se si guardano le date dei vostri downvotes è ovvio weren sono da me Anzi, potrei provarlo effettuando un downvote in un determinato momento prestabilito e sarai sicuro di non averlo downvotato. E capisco perché ti hanno downvoted, perché le persone (come me) che fanno una determinata ricerca potrebbero ovviamente ** non ** usare la tua risposta. Stai sprecando il tempo dei visitatori qui rispondendo alla domanda sbagliata. E dov'è la ridondanza di cui stai parlando? ** Alla domanda non è stata data risposta **, una classe Globals con variabili statiche in Android è sicura?Qual è la risposta? Sì/No – Pacerier

Problemi correlati