Как выбрать оптимальный размер изображения, чтобы он не превышал бюджет виртуальной машины? - PullRequest
7 голосов
/ 01 апреля 2011

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

enter image description here

Ответы [ 4 ]

12 голосов
/ 05 апреля 2011

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

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, чтобы выбрать подходящий размер для вашего приложения.

1 голос
/ 05 апреля 2011
1 голос
/ 01 апреля 2011

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

0 голосов
/ 01 ноября 2012

До сих пор я не нашел надежного способа справиться с размером изображения в сравнении с доступной памятью. Проблема в том, что память очень быстро фрагментируется, так что у вас может быть 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 для изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...