Как создать таблицу, похожую на список ежевики? - PullRequest
0 голосов
/ 14 января 2012

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

Я следил за использованием памяти во время загрузки, и она медленно увеличивалась до 10-18 Мб, прежде чем сборщик мусора начал работать.Однако, как только все миниатюры кэшируются на телефоне, он использует около 100 мегабайт для считывания изображений с диска, удваивает их размер, создает 471 настраиваемое поле изображения и отображает их.Общий размер 471 миниатюры составляет 427 кб.Как система может использовать столько памяти для загрузки этих файлов?

Однако, если бы я мог использовать поле списка, например tablelayoutmanager, мне бы не пришлось создавать эти дополнительные 471 настраиваемые поля изображений и простонепосредственно добавьте изображения в поле списка.

Кто-нибудь должен был сделать что-то подобное или иметь пример того, как достичь табличного формата, используя поле списка?

1 Ответ

2 голосов
/ 14 января 2012
  1. 427 КБ - это размер загружаемых изображений PNG. PNG сжаты. Когда вы открываете их в памяти, они фактически расширяются, так что каждый пиксель изображения может содержать до 4 байтов (ARGB) значений (в зависимости от формата), а также другие метаданные PNG.

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

  3. Добавление изображений непосредственно в поле списка не будет иметь никакого значения. Вы все еще будете загружать их в память. Что вам нужно сделать, так это иметь какой-то управляемый кэш в памяти, скажем, максимум 20 изображений. Ваш код должен быть достаточно умным, чтобы в любой момент определить, где в поле списка находится пользователь, и отобразить изображения для этого представления.

Итак, скажем, у каждого объекта поля списка (или строки) есть тег, связанный с соответствующим изображением (например, имя файла). Как только пользователь закончит прокрутку вверх / вниз, вы можете загрузить изображения для этого представления. Если первая строка, отображаемая в поле списка, - это строка 20, и вы можете отобразить 8 элементов, вам нужно будет захватить изображения 20–28 и загрузить их в кэш в памяти, если их еще нет (поэтому сначала проверьте кэш). ). Затем вызовите invalidate () в поле списка, чтобы убедиться, что оно перерисовывается.

Threading:

a) Вам не понадобится поток, чтобы определить, где находится пользователь в любой точке. Вы должны быть в состоянии использовать методы moveFocus или методы навигации и выяснить, где находится пользователь.

б) Для загрузки изображений необходим механизм организации очередей. Очереди задач достаточно просты для реализации, как только вы освоите механизм потоков / блокировки. Каждая задача в очереди будет загружать изображение в свой собственный поток. Вам нужно установить ограничение на количество активных задач (потоков) в очереди одновременно. Я бы пошел на 3-5 максимум (это из опыта на BB платформах). Для реализации очередей я бы предложил, читая об очередях задач / заданий и проблемах производителя / потребителя.

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

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