Гигантская галерея изображений онлайн - Как я избегаю OutOfMemoryError?

Для любого, кто задается вопросом, галереей является http://www.spore.com/sporepedia.

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

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

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

1
задан Ben L. 22 May 2010 в 18:44
поделиться

1 ответ

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

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

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

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

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

2
ответ дан 3 September 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: