Domanda

Sto creando un'applicazione di ricerca eventi, impostiamo i criteri di ricerca da una schermata e li popoliamo in un'altra schermata, quindi l'utente può modificare i criteri di ricerca dalla terza schermata e passare alla quarta schermata.

Per raggiungere il compito sopra indicato sto utilizzando un oggetto statico che ricorda i valori dell'applicazione e non ho bisogno di fare nulla in più.

Ma temo che se si parla del ciclo di vita degli oggetti statici in Android se si trova poca memoria, Android elimina gli oggetti statici ???

Poiché Android supporta il multitasking, se l'utente passa a un'altra applicazione e quando ritorna l'applicazione inizia a comportarsi in modo pazzo, l'oggetto statico viene rimosso quando è multitasking???qualche idea ??e suggerire anche che tenere un oggetto statico tramite il metodo singleton sia un approccio migliore ???

È stato utile?

Soluzione

Iniziamo con un po’ di background:Cosa succede quando si avvia un'applicazione?
Il sistema operativo avvia un processo, gli assegna un ID processo univoco e alloca una tabella dei processi. Un processo avvia un'istanza di DVM (Dalvik VM);Ogni applicazione viene eseguita all'interno di un DVM.
Un DVM gestisce il caricamento e lo scaricamento delle classi, il ciclo di vita dell'istanza, il GC ecc.

Durata di una variabile statica:Una variabile statica nasce quando una classe viene caricata dalla JVM e muore quando la classe viene scaricata.

Pertanto, se crei un'applicazione Android e inizializzi una variabile statica, rimarrà nella JVM finché non si verifica una delle seguenti condizioni:
1.la classe è scarica
2.la JVM si spegne
3.il processo muore

Tieni presente che il valore della variabile statica persisterà quando passi a un'attività diversa di un'altra applicazione e non si verifica nessuno dei tre casi precedenti.Se si verifica uno dei tre casi precedenti, lo statico perderà il suo valore.

Puoi testarlo con poche righe di codice:

  1. stampa lo statico non inizializzato in onCreate della tua attività -> dovrebbe stampare null
  2. inizializzare lo statico.stampalo -> il valore non sarebbe nullo
  3. Premi il pulsante Indietro e vai alla schermata principale.Nota:La schermata iniziale è un'altra attività.
  4. Avvia nuovamente la tua attività -> la variabile statica sarà diversa da zero
  5. Uccidi il processo di richiesta da DDMS (pulsante di arresto nella finestra dei dispositivi).
  6. Riavvia la tua attività -> lo statico avrà valore nullo.

Spero che aiuti.

Altri suggerimenti

Bene, il pattern Singleton si basa anche sull'utilizzo di variabili statiche quindi in realtà si sarebbe nella stessa posizione. Mentre l'approccio statico può funzionare il più delle volte, può accadere che in alcuni casi quando la memoria è piena e un'altra attività prende il primo piano prima che l'applicazione si sposta nella schermata successiva, processo del vostro attività potrebbe essere ucciso e si perdono i valori statici. Tuttavia Android offre alcune opzioni di persistere valori tra stati o trasmissione come ad esempio:

  • utilizzando un Intent, si potrebbe passare lungo i criteri di ricerca da attività a l'attività (simile ad un web http richiesta)
  • utilizzando le preferenze dell'applicazione, è potrebbe salvare i valori e recuperare loro l'attività che ha bisogno di loro
  • utilizzando il database SQLite è possibile li persistere in una tabella e recuperare in un secondo momento
  • se avete bisogno di salvare solo l'attività Stato in modo che al riavvio, i campi avere riempito con la loro precedenza valori selezionati, è possibile implementare l'onSaveInstanceState () di attività Metodo - notare che questo non è raccomandato per tra le attività persistenza di stati.

È possibile ottenere alcuni esempi di codice di utilizzo delle preferenze, intenti e il database SQLite, cercando in codice sorgente aegisshield albero in Google code o in altre applicazioni Android open source.

Dopo alcune ricerche, si scopre che l'utilizzo di applicazioni per archiviare single che non è grande di un'idea, a meno che non si è pronti a ricrearlo:

Non conservare i dati in oggetto applicazione

la risposta accettata è tecnicamente corretto, ma non fornisce tutte le informazioni.

Come suggerisce il link di cui sopra, se si vuole veramente restare con quel modello, è necessario essere pronti a verificare la presenza di nulla e ricreare i dati, se possibile.

@ r1k0 è proprio qui. la memorizzazione dei dati in campi statici di una classe non persisteranno sul proprio attraverso processo di applicazione uccide e si riavvia. Android uccide regolarmente i processi in esecuzione (apps) quando ha bisogno di memoria.

Per il doc Android: stato di attività e l'espulsione dalla memoria ,

  

Il sistema non uccide direttamente un'attività. Invece, uccide la   processo in cui l'attività viene eseguito, distruggendo non solo l'attività   ma tutto il resto in esecuzione nel processo, pure.

È possibile salvare e ripristinare lo stato dei primitivi e oggetti Serializable e Parcelable utilizzando i metodi indicati. Questi sono chiamati automaticamente durante il normale ciclo di vita di attività.

protected void onSaveInstanceState(Bundle state) {}
protected void onRestoreInstanceState(Bundle savedInstanceState){}

Quindi, se si dispone di una classe che ha solo variabili statiche, è possibile salvare lo stato di ogni campo in onSaveInstanceState () e ripristinarli in onRestoreInstanceState (). Quando Android uccide il processo che la vostra applicazione è in esecuzione in, lo stato delle variabili verrà salvato, e quando Android ripristina la vostra applicazione, i valori verranno ripristinati in memoria nello stesso stato di prima.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top