2012-04-02 14 views
7

Nella mia applicazione ho Loginattività. Ha un nome utente variabile statico e verrà assegnato con l'utente inserire i valori del nome utente. Attività di avvio dell'attività di login A e A di avvio B. In A utilizzo la variabile Loginactivity.username.Comportamento variabile statica android sul crash dell'applicazione

Ora a causa di qualche errore in B, l'applicazione si blocca. Quando premo force close, l'applicazione viene riavviata e l'attività A è l'attività corrente. Nell'attività A sto usando una variabile statica Loginactivity.username. Vedo che dopo l'arresto anomalo questa variabile sta ottenendo il suo valore iniziale che è una stringa vuota "";

Perché sta succedendo così? Puoi spiegare questo comportamento? Quindi, quando l'applicazione si blocca tutte le attività nello stack vengono riavviate? Vedo che oncreate di Loginattività non viene chiamato. Quindi come viene modificato il valore della variabile statica?

risposta

11

Sì, quando un'applicazione si blocca, la jvm per questa app viene riavviata, le classi vengono ricaricate e si perdono tutte le variabili statiche e le variabili di istanza.

La soluzione è rimuovere la causa di arresto anomalo. :)

+0

Ho risolto il crash, ma volevo conoscere il comportamento. Grazie . – png

+3

Questa è stata comunque una buona domanda, non menzionata nei documenti Android. – Snicolas

+0

Accetta la risposta se adatta. – Snicolas

1

Questo perché si ha una perdita di memoria causata da questo membro statico che si mantiene in LoginActivity.

Vorrei prendere in considerazione questa variabile in ambito applicazione (classe applicazione personalizzata) o salvarla nel DB.

In ogni caso, ricordarsi di annullare questa variabile quando l'applicazione è stata completata.

2

Utilizzare SharedPreferences invece, o memorizzare informazioni in classe Application

3

Quando la vostra attività B si blocca la macchina virtuale Dalvik di Android che l'applicazione viene eseguita in (ogni applicazione ha una propria DVM che sono processi separati) viene ucciso. Quando si avvia Activity A, il nome utente è "" perché Java di default imposta tutte le variabili di istanza (variabile di classe o campi se si desidera) su null (riferimenti), 0 (primitive) e "" per le stringhe. Quindi la tua attività A funziona correttamente. Hai solo bisogno di memorizzare il nome utente nelle preferenze condivise, un database o attivare l'evento per l'utente di nuovo accesso ... Vorrei anche correggere Attività B ... Haha

+0

Qui ho un dubbio: se l'applicazione viene riavviata, come ottiene lo stack di attività precedente. La mia applicazione ogni volta che viene riavviato in Loginattività leggo il nome utente da sharedpref. Vedo che l'attività di login non viene riavviata, viene avviata l'attività instabile A in cima allo stack. E in A set variabile come Loginactivity.username e questa variabile viene resettata anche se l'attività non viene riavviata! – png

+0

Forse i tuoi prefs condivisi non funzionano correttamente. Il tuo stack è stato ucciso con la VM. O la tua logica per bypassare l'attività di login ha un problema tecnico. Fonte? – jjNford