Ошибка нехватки памяти - растровое изображение превышает бюджет виртуальной машины в Android при использовании растровых изображений на картах - PullRequest
2 голосов
/ 16 июля 2011

Я рисую изображения высоты и ширины, равные экрану устройства, в качестве элемента наложения в Android. Но когда количество изображений превышает приложение вылетает с ошибкой Out Of Memory - Bitmap превышает бюджет виртуальной машины. Если я пытаюсь переработать его, то возникает ошибка, когда холст пытается использовать переработанное растровое изображение. Что мне нужно, так это иметь лучший способ нанесения большого количества изображений на карту. Изображения приходят с сервера, и мне также нужно кэшировать изображения. Для кеширования в настоящее время я делаю это в LinkedHashMap, но я предполагаю, что даже это создаст проблемы, поскольку я храню рисуемые объекты.

Есть ли пример использования построения больших растровых изображений на картах?

Ответы [ 2 ]

2 голосов
/ 16 июля 2011

Возможно, вы захотите использовать свойство inSampleSize класса BitmapFactory.Options. Это свойство будет изменять масштаб вашего изображения степенью 2 (которую вы решите) при создании растрового объекта, что позволит сэкономить память. Если разрешение изображения превышает разрешение экрана, это должно работать для вас без проблем, без ухудшения качества изображения.

Чтобы использовать это для изображения, которое вы загружаете с сервера, вы можете использовать его следующим образом:

URL url = new URL(photoUrl);
URLConnection ucon = url.openConnection();

Options options = new Options();
options.inSampleSize = 2;

Bitmap bitmap = BitmapFactory.decodeStream(ucon.getInputStream(),null, options);

В качестве альтернативы можно также обернуть каждый объект растрового изображения в вашем HashMap объектом SoftReference, чтобы виртуальная машина освободила память, используемую растровыми изображениями, вместо сбоя с ошибкой OOM. Недостатком является то, что вам придется перезагрузить растровое изображение, и лично я чувствую, что виртуальная машина агрессивна при восстановлении памяти. Он восстанавливает память довольно быстро.

0 голосов
/ 16 июля 2011

Каждое приложение имеет очень ограниченный объем памяти (часто 16 МБ, но я видел всего 14 МБ и 32 МБ). Это зависит от прошивки, работающей на каждом устройстве. Класс приложения может быть унаследован для обеспечения доступа к функции «LowMemory», которая может предупреждать вас, когда ваше приложение использует почти всю свою память.

У вас не должно быть проблем с изображениями размером с экран, но убедитесь, что они не до смешного размера (пусть они будут как можно меньше).

Я бы также порекомендовал проверить статистику памяти в Eclipse, чтобы увидеть, сколько памяти использует ваше приложение (чтобы увидеть, как оно растет и т. Д.).

Эта ошибка является одной из самых раздражающих ошибок при работе с Картами и Android, и вы найдете множество других сообщений, связанных с этой проблемой, здесь, на SO

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