Czytałem How do I discover memory usage of my application in Android? i kilka innych odpowiedzi, ale może nie całkiem paznokci to w dół ...Ustalenie dostępną przestrzeń sterty na aktywność (OutOfMemoryException zapobiegania)
mam działalność, która będzie załadować plik z pamięć zewnętrzną do pamięci i wykonaj niektóre operacje parsowania/manipulacji/etc in-memory. Zanim go załaduję, chcę zgadnąć, czy spowoduje to wyjątek OutOfMemoryException i zawiesi działanie (Rozumiem, że dokładne odpowiedzi nie są możliwe, ocena jest lepsza niż nic).
Z powyższej odpowiedzi , wymyśliłem:
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;
więc pytania:
1) jestem szalony?
2) jak połączyć wartości z obiektu MemoryInfo, aby oszacować wykorzystanie sterty aktywności/zadania? (Powyższy link zawiera przegląd wiadomości pss/private-dirty/shared-dirty, ale niewystarczająco dużo informacji, aby zgadnąć, jak to zrobić.)
3) czy debugowanie zawsze istnieje lub tylko podczas debugowania?
4) Czy istnieje mądrzejszy sposób?
Odpowiedzi takie jak te: Two questions about max heap sizes and available memory in android wydają się sugerować, że nie ma lepszej metody niż to?
Wiem, że używanie mniejszej ilości pamięci jest dobrą rzeczą i jestem. Chciałbym wiedzieć, jak kodować defensywnie, tutaj. Wydaje się dziwne, że trzeba tylko poczekać na wyjątek, aby wiedzieć, że brakuje Ci pamięci.
Dzięki!