Не удается освободить память встроенного кеша рисования в Android 3.0 - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть приложение с меню, где пунктами меню являются скриншоты из представлений ViewAnimator. Все работает нормально. Я делаю скриншоты с помощью этого простого фрагмента, используя кеш рисования, как написано во многих примерах:

    // Drawing cache is off, so build it manually and create scaled bitmap
    layout.buildDrawingCache();
    Bitmap bm = layout.getDrawingCache();
    Bitmap bm_small = Bitmap.createScaledBitmap(bm, item_width, item_height, true);

В той же функции я пытаюсь освободить всю память, используемую для создания скриншота:

    layout.destroyDrawingCache();
    bm.recycle();
    bm = null;

Но, к сожалению, сборщик мусора не освобождает эту растровую память. Я также использовал анализ памяти HPROF, чтобы найти ссылки на растровое изображение, которые не могут быть освобождены, но мне это не удалось. Важная информация состоит в том, что я разрабатываю для Honeycomb Android 3.0, поэтому скриншоты довольно большие - каждый скриншот занимает около 3 МБ памяти и не освобождает ее.

Я не понимаю, почему recycle не работает в этом примере. Я подозреваю, что в моей настройке есть какая-то особенная проблема: Android 3.0 Honeycomb + Аппаратное ускорение включено + Большая куча включена + Использование кэша чертежа. Ни один из подсказок, которые я нашел, не помогает.

Пожалуйста, вы можете объяснить, почему recycle не работает в этом случае? Буду очень признателен за любую помощь.

1 Ответ

0 голосов
/ 16 декабря 2011

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

и другие рекомендации - использовать SoftReference<Bitmap> для хранения ваших объектов данных. SoftReferenced объекты удаляют себя, когда требуется память. Осторожно, вы можете получить недостающие предметы.

метод растрового изображения, однако, просто ошибочен.

...