Как выбрать оптимальный размер образа, чтобы не превысить бюджет ВМ?

В моем приложении пользователи выбирают изображения, а программа позволяет пользователям вносить изменения в изображения. Поскольку существует много разных устройств Android, моя программа дает сбой на некоторых устройствах с меньшим размером кучи. Я хочу рассчитать наилучшие размеры для телефона пользователя, чтобы он не вылетал из-за бюджета виртуальной машины. Я добавил скриншот из «Picsay Pro», который делает именно то, что я ищу. Я знаю о "BitmapFactory.Options". Моя единственная проблема - найти способ определить размеры изображения, который не позволит разбить приложение из-за бюджета виртуальной машины.

введите здесь описание изображения


person dirhem    schedule 01.04.2011    source источник


Ответы (4)


Подсчитайте оставшееся свободное место на телефоне:

long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());

где,

Runtime.getRuntime().maxMemory() — возвращает размер общего предела кучи (в байтах).

Debug.getNativeHeapAllocatedSize() — возвращает количество данных, уже использованных вашим приложением (в байтах).

Рассчитайте размер используемого растрового изображения по этой формуле,

long Bytes_allocated = (height of the Image) * (width of the Image) * 4;

Сравните freeMemory и Bytes_allocated, чтобы выбрать подходящий размер для вашего приложения.

person AjOnFire    schedule 05.04.2011

На самом деле я сжимал изображения на телефоне по двум причинам. Один из них — скорость загрузки, а другой — проблемы с кучей. Вы можете попробовать сделать что-то подобное или хотя бы опубликовать трассировку стека!

person Kevin Parker    schedule 01.04.2011


До сих пор я не нашел надежного способа справиться с размером изображения и доступной памятью. Проблема в том, что память очень быстро фрагментируется, так что у вас может быть 10 МБ свободного места, но нет непрерывного пространства для образа размером 2 МБ. Что действительно необходимо, так это размер наибольшего свободного пространства, но, похоже, нет никакого способа получить его. Лучше бы был способ дефрагментации памяти, но и для этого такой функции не существует.

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

Поскольку планшеты конца 2012 года теперь имеют разрешение 1920x1280, нам теперь требуется 20 МБ непрерывной памяти для одного фонового изображения! Похоже, что некоторые из этих планшетов теперь поддерживают кучи до 256 МБ, но, хотя выделение большего пространства для виртуальных машин, по-видимому, решает эту проблему, нам действительно нужен дефрагментатор памяти или способ резервирования места.

Есть один трюк, который может помочь, если размер изображения не масштабируется и не изменяется, и каждое измененное изображение имеет одинаковый размер И вы ограничиваете свое приложение Android 3.0+:

Options opt2 = new BitmapFactory.Options();
opt2.inBitmap = mBitmap;        // reuse mBitmap to reduce out of memory errors
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2);

Это позволит повторно использовать ту же mBitmap области памяти для изображения.

person Frank    schedule 31.10.2012