Ho letto How do I discover memory usage of my application in Android? e un mucchio di altre risposte, ma non arrivano a chiodo questo giù ...Rilevamento dello spazio heap disponibile per attività (prevenzione OutOfMemoryException)
ho un'attività che caricare un file da memoria esterna in memoria e fare un po 'di parsing/manipulation/etc in memoria. Prima di caricarlo, voglio indovinare se farlo o meno causerà una OutOfMemoryException e mandare in crash l'attività (ho capito che le risposte esatte non sono possibili, una stima è meglio di niente)
Dalla risposta di cui sopra , mi si avvicinò con:
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(ACTIVITY_SERVICE);
MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
int pid [] = {android.os.Process.myPid()};
android.os.Debug.MemoryInfo[] mi = activityManager.getProcessMemoryInfo(pid);
// calculate total_bytes_used using mi...
long available_bytes = activityManager.getMemoryClass()*1024*1024 - total_bytes_used;
Quindi, le domande:
1) sono pazzo?
2) come calcolare i valori dall'oggetto MemoryInfo per stimare l'utilizzo dell'heap dell'attività/attività? (Il link sopra fornisce una panoramica di pss/private-dirty/shared-dirty, ma non abbastanza informazioni per indovinare come eseguire il totale.)
3) Debug esiste sempre o solo quando si esegue il debug?
4) c'è un modo più intelligente?
Risposte come queste: Two questions about max heap sizes and available memory in android sembrano implicare che non esiste un modo migliore di questo?
So che usare meno memoria è una buona cosa, e lo sono. Sono interessato a sapere come codificare in modo difensivo, qui. Sembra strano aspettare solo un'eccezione per sapere che hai esaurito la memoria.
Grazie!