2010-05-22 2 views
0

Для всех, кто задается вопросом, галерея http://www.spore.com/sporepedia.Гигантская галерея изображений в Интернете - Как избежать OutOfMemoryError?

Мое приложение использует Spore API для получения 100 новейших творений, а затем отображает их в GridView. Текстовые данные о творениях легко хранить, но изображения представляют проблему.

Насколько я знаю, я могу либо держать изображения в Hashtable, либо захватывать их каждый раз, когда они просматриваются. Ни один из них не будет работать - Hashtable быстро представляет OutOfMemoryError, а постоянная перезагрузка вызывает большую нагрузку на сервер и большую задержку на клиенте.

Есть ли лучший способ для хранения изображений?

ответ

2

Сначала не получайте 100 за один раз, вы не сможете отображать 100 изображений в виде сетки и иметь их видимый видимый размер. Извлеките изображения асинхронно и получите полный экран или экран и половину за раз. Я предполагаю, что вы можете отображать от 6 до 9 изображений приличного размера на экран с поддержкой элементов текста/пользовательского интерфейса, вы даже можете выбрать, сколько из них будет отображаться на основе экранов/разрешений телефонов. Поэтому вы, вероятно, должны получать от 9 до 12 изображений за раз.

Во-вторых, я не знаю, к какому разрешению относятся эти изображения, но это звучит как «большой». Если API поддерживает, он получает только миниатюру для просмотра сетки. Если нет, то, что я, вероятно, сделаю, будет: когда вы получите изображение из API, сначала создайте новое изображение, уменьшенное до размера, необходимого для вашего эскиза, который входит в сетку, сохраните это в памяти. Затем создайте новое изображение, уменьшенное до размера, необходимого для экрана «подробно» (если он у вас есть), и кешируйте его на SD-карте и освободите его от ram, а также исходного исходного изображения, это масштабирование должно, вероятно, возникнуть в отдельном потоке, чтобы избежать воздействия на ваш поток пользовательского интерфейса. В зависимости от шаблона использования я бы, вероятно, также кэшировал миниатюры на SD-карте, поэтому было бы дешево освободить RAM, который они используют в onStop/onPause, и перезагрузить их в onStart/onResume. IT также звучит так, будто вы загружаете «топ-100» или что-то в этом роде. Поскольку я не ожидал, что в каждом приложении будет задействован новый топ-100, вы сможете сэкономить много сетевого трафика, кэшируя изображения и информацию на SD-карту и загружая только новые записи каждый раз, когда запускается программа.

В качестве альтернативы процесс, как:

Получить изображение -> Scale в месте с размером детали -> подробно кэш размер -> масштаб подробно размер в размер эскиза на месте -> отображение эскизов в GridView во время кэширования миниатюру асинхронно

Использовал бы еще меньше памяти, поскольку в памяти только 1 копия изображения, но это замедлит реакцию gridview, так как изображение нужно масштабировать дважды, прежде чем оно будет отображаться. Он может быть достаточно быстрым, чтобы не иметь значения, или вы можете играть в трюки с видом сетки, отображая большое изображение (масштабированное внутри), в то время как эскиз создается в фоновом режиме, переключая сетку на миниатюру, когда она готова. Вам просто нужно попробовать, чтобы определить, достаточно ли он достаточно.

Смежные вопросы