Sono abbastanza nuovo per lo sviluppo di Android e non riesco a capire l'eccezione Java Out of Memory. So che significa che la mia app ha superato il budget della VM, ma dopo aver cercato su Google molte volte non riesco ancora a cogliere questo concetto. Ho paura che la mia app utilizzi troppa memoria perché ho sei selettori di pulsanti per schermo con due bitmap per ciascun selettore che sono circa 20 kb ciascuno secondo la scheda delle proprietà. Sul mio G2x root ho impostato il budget della VM su 12mb, ho riavviato il mio telefono e ho eseguito la mia app senza problemi. Sto relegando i drawable su ogni onDestroy() e accennando al GC di correre anche qui. Dopo aver usato l'app per un po 'nell'emulatore, faccio clic su "Cause GC" sullo schermo DDMS ei risultati sono ID = 1, Dimensione heap 6.133 MB, Assegnato 2.895 MB, Libero 3.238 MB,% utilizzato 47.20, # Oggetti 52.623.Dimensioni di heap di comprensione Android
Questo è dove non capisco cosa sta succedendo, il mio emulatore è impostato su 24MB di VM. Dov'è quel numero? Il vero problema che sto avendo è che se imposto l'emulatore su 16MB di VM, la mia app si arresta in modo anomalo sulla seconda attività con l'eccezione Memoria esaurita. Come mai non si blocca sul mio telefono con la VM impostata su 12 MB o sul mio vecchio telefono HTC Magic con 12 MB di VM stock? Credi anche che la mia app stia occupando troppa memoria? Non ho idea se quei numeri DDMS siano buoni o no. Grazie per il tuo tempo.
Per quanto riguarda il mio codice, ho ogni immagine specificata nei layout XML. Non faccio nulla di programmatico con loro tranne che per aggiungere gli ascoltatori a loro. Ho trovato questo pezzo di codice su qui e ho aggiunto ad ogni attività che ho ...
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Altrimenti non faccio altro che aggiungere onClickListeners ai pulsanti che hanno gli sfondi PNG. Mi piacerebbe imparare come specificare gli sfondi dei pulsanti in modo programmatico, ma ho bisogno di avere le funzioni di selettore come messa a fuoco, in stampa, non focalizzato ma premuto ecc. Per far cambiare lo sfondo dei pulsanti in base all'interazione dell'utente. Ho esaminato i documenti a riguardo ma sembra schiacciante, ecco perché ho pensato di iniziare da qui con le basi della gestione degli heap e di lavorare fino a specificare i selettori nel codice. Questo potrebbe non avere senso, ma c'è una quantità "sana" di allocazione di memoria che un'app potrebbe allocare senza avvicinarsi all'eccezione di memoria insufficiente? Ad esempio, se un'app allocata 6 MB dovrebbe essere soddisfacente, ma 8 MB lo spingono, ci sono limiti del genere nell'allocazione della memoria? Grazie ancora Alex Lockwood per la tua risposta leggerò e rileggerò di nuovo fino a quando questa roba non ha senso per me
+1, risposta molto informativa! –
Grazie mille! Ho imparato molto da questo. Aggiungo alcune informazioni alla fine della domanda –
Rifiuta il commento "20 kb ciascuna suona bene" - AFAIK, non importa quale sia la * dimensione del file * (che sarà più piccola per le immagini che comprimono meglio), conta ciò che * DIMENSIONI * sono; in memoria, per full color, prenderà 4B per pixel, giusto? Quindi, è importante ridimensionare l'immagine quando la si carica [documenti android - Carica una versione ridotta in memoria], in base alla dimensione effettiva necessaria, per il dispositivo corrente. – ToolmakerSteve