Как определить, насколько близка ваша активность к достижению предела памяти? - PullRequest
3 голосов
/ 15 октября 2010

Я пишу приложение графического дизайна для Android, где пользователь может добавить несколько изображений в документ, где каждое изображение хранится в виде растрового объекта.Каждое растровое изображение имеет размер примерно 800x400 пикселей и использует пиксельный формат ARGB8888 (т.е. ~ 1,5 МБ каждое).

Я знаю, что большинство устройств Android первого поколения имеют ограничение кучи 16 МБ, и это ограничение составляет 24 МБ.и больше для новых телефонов.Я также знаю, что память для растровых изображений выделяется извне, но я запутался и что это означает.

Мой вопрос: как я могу сказать во время выполнения, что добавление нового растрового изображения меня тоже получит?близко к пределу памяти?

Прежде чем кто-то предложит "не использовать столько памяти", я знаю, что у меня есть один вариант - ограничить количество растровых изображений, которые пользователь может создать, чтобы я знал, что этот предел безопасендля самых простых телефонов Android.Тем не менее, я хотел бы, чтобы телефоны с большим пределом памяти поддерживали большее количество растровых изображений и / или большие растровые изображения.

Я знаю, что нужно проверять исключения OutOfMemory при выделении растровых изображений.Однако будут ситуации, когда у меня останется только достаточно памяти для выделения еще одного растрового изображения.После этого все приложение будет нестабильным, потому что даже выделение небольших вещей, таких как строки, может вызвать исключение OutOfMemory.Это то, чего я хочу избежать.

Я не уверен, как определить «слишком близко к пределу памяти», но я подозреваю, что-то вроде «не выделяйте более половины вашей доступной памяти для растровых изображений"будет работать нормально, так как другие мои структуры данных, которые я храню в памяти, малы по сравнению.

Ответы [ 2 ]

2 голосов
/ 15 октября 2010

Используйте этот метод для регистрации используемой памяти, но я уже опубликовал это на

Android: исключение из-за недостатка памяти в Галерее

см. Этот пост для дальнейшего объяснения.

public static void logHeap(Class clazz) {
    Double allocated = new Double(Debug.getNativeHeapAllocatedSize())/1048576.0);
    Double available = new Double(Debug.getNativeHeapSize())/1048576.0);
    Double free = new Double(Debug.getNativeHeapFreeSize())/1048576.0);
    DecimalFormat df = new DecimalFormat();
    df.setMaximumFractionDigits(2);
    df.setMinimumFractionDigits(2);

    Log.d(APP, "debug. =================================");
    Log.d(APP, "debug.heap native: allocated " + df.format(allocated) + "MB of " + df.format(available) + "MB (" + df.format(free) + "MB free) in [" + clazz.getName().replaceAll("com.myapp.android.","") + "]");
    Log.d(APP, "debug.memory: allocated: " + df.format(new Double(Runtime.getRuntime().totalMemory()/1048576.0)) + "MB of " + df.format(new Double(Runtime.getRuntime().maxMemory()/1048576.0))+ "MB (" + df.format(new Double(Runtime.getRuntime().freeMemory()/1048576.0)) +"MB free)");
    System.gc();
    System.gc();

    // don't need to add the following lines, it's just an app specific handling in my app        
    if (allocated>=(new Double(Runtime.getRuntime().maxMemory())/1048576.0)-MEMORY_BUFFER_LIMIT_FOR_RESTART)) {
        android.os.Process.killProcess(android.os.Process.myPid());
    }
}
0 голосов
/ 15 октября 2010

Возможно, переопределение класса onLowMemory позволит вам делать то, что вы хотите.

@Override
public void onLowMemory() {
    super.onLowMemory();
    //What you want to do
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...