2013-10-09 15 views
5

Ciao Siamo di fronte a uno strano problema nella nostra applicazione Android. Nella nostra app stiamo memorizzando tutti gli oggetti/dati necessari in un oggetto comune (chiamato come oggetto A) quando avviiamo l'app (prima attività). Abbiamo memorizzato il contesto stesso in quell'oggetto. Ogni volta che abbiamo bisogno di un contesto nella nostra app, otteniamo il contesto dall'oggetto A e lo usiamo. Tutti i casi funziona bene eccetto i casi seguenti.

i) Mentre la nostra app è in background, abbiamo giocato a giochi di fascia alta. Ora siamo tornati all'app tramite schermo minimizzato (app recenti). Improvvisamente l'app si è bloccata.
ii) Se forziamo l'arresto dell'applicazione tramite Impostazioni, e torniamo all'app tramite schermo ridotto, si verifica lo stesso arresto anomalo.
L'oggetto diventa nullo

Entrambi i casi, l'oggetto A diventa null (potrebbe essere rimosso da GC), quindi tutte le operazioni dipendenti dall'oggetto A ottenendo eccezioni.

Perché sta succedendo? Come possiamo impedire a GC di raccogliere l'oggetto A? Come possiamo gestire la fermata della forza? Si prega di dare qualche idea.

+0

Non è possibile forzare il GC o il sistema dall'uccidere il processo. In questi casi dovresti trovare un modo per serializzare/deserializzare il tuo oggetto. –

+0

Questo è probabilmente il concetto più importante che dovresti capire quando scrivi app per Android. http://developer.android.com/training/basics/activity-lifecycle/index.html – Kuffs

+0

Android (in realtà, Dalvik) NON esegue GC singoli oggetti a meno che l'app non sia in esecuzione e non ci siano riferimenti ad essa. Non ho idea di dove sia iniziato questo mito. La tua ** app ** potrebbe essere uccisa, nel qual caso tutto parte da zero. Se hai bisogno di salvare lo stato, serializza usando 'onPause()' e/o 'onStop()'. Nota, 'onDestroy()' è utile solo se si termina() 'un'attività. A proposito, se quel 'contesto' che stai memorizzando è un contesto' Activity', stai sbagliando tutto. – Simon

risposta

7

Perché sta succedendo?

Anche altre app necessitano di memoria. Non è ragionevole presumere che Android conserverà i tuoi dati in memoria indefinitamente.

Come si impedisce a GC di raccogliere l'oggetto A?

No. Trova una soluzione diversa al tuo problema.

Come possiamo gestire il blocco della forza? Si prega di dare qualche idea.

Alla fine, la decisione spetta a voi, ma qui ci sono alcune opzioni comuni:

  • Quando i dati memorizzati non esiste più, considerare questo come un lancio fresco della app. Porta l'utente alla pagina di destinazione e fagli iniziare una nuova partita.
  • Persistere i dati. A seconda di ciò che stai memorizzando, SharedPreferences o SQLite potrebbero essere buone opzioni. Vedere Storage Options per un riepilogo delle opzioni di archiviazione.

La seconda opzione ovviamente non funzionerà per il Contesto, ma probabilmente progetterei comunque una soluzione diversa per il contesto.

2

È meglio utilizzare il contesto dell'applicazione per quello! Basta usare getApplicationContext() nel tuo Activity e usarlo invece. Altrimenti l'attività perde non appena il sistema ha bisogno di memoria.

L'attività viene eseguita in background quando si preme Home, quando si riproducono videoGames o app che consumano memoria, l'attività viene liberata dal sistema.

cercare di capire l'attività del ciclo di vita per risolvere questo:

enter image description here

Inoltre quando vederlo in java "normale" il vostro oggetto Avvolto per l'attività viene raccolto dal GC non appena la sua eligable per esso , cioè non è più referenziato da nessun altro oggetto. Questo non può essere impedito se l'intera app viene liberata quando il sistema ha bisogno di memoria. Prova a verificare null in onResume() e riattiva nuovamente il tuo Oggetto!

Spero che questo possa aiutarti.

Problemi correlati