Android: Галерея с множеством изображений - как загружать изображения по мере необходимости? - PullRequest
0 голосов
/ 06 января 2011

В приложении для Android у меня есть набор миниатюр для скачивания. Поскольку пользователь использует приложение, этот набор миниатюр может содержать до 100 или более элементов, потенциально.

Миниатюры должны отображаться в галерее, и сейчас, когда эта галерея отображается, я запускаю один поток, чтобы загрузить все миниатюры от 0 до конца набора. Это плохо в нескольких отношениях - каждое изображение загружается, даже если оно не требуется, и если галерея имеет 30-й элемент по центру, то пользователь не увидит изображения для него, пока не будут загружены все первые 20 изображений. .

В идеале, я хотел бы, чтобы изображения загружались и отображались по мере необходимости - поэтому, если 30-й элемент был центрирован при отображении галереи, то 29-й, 30-й и 31-й элементы были бы загружены и отображены, тогда, если пользователь прокрутил влево 28, 27 и т. д. будут загружены. Я не уверен, что это реально / эффективно.

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

У кого-нибудь есть мысли / советы о том, как этого добиться?

Cheers, r3mo

Ответы [ 3 ]

2 голосов
/ 06 января 2011

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

Например:

  1. Пользователь открывает приложение, видя изображения 1, 2 и 3
  2. Вы начинаете скачивать 1, 2 и 3 с высоким приоритетом.
  3. Вы начинаете скачивать 4, 5 и 6 с более низким приоритетом.
  4. Пользователь прокручивает изображения 23, 24 и 25.
  5. Вы дадите ему мгновение, чтобы убедиться, что они остановились.
  6. Вы отменяете темы на 1-6 и начинаете скачивать 23, 24 и 25 с высоким приоритетом.
  7. Вы начинаете скачивать 20, 21 и 22, а также 26, 27 и 28 с более низким приоритетом.

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

1 голос
/ 06 января 2011

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

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

1.) У вас есть ThreadPool с фиксированным количеством потоков. 2.) Вы добавляете новый Runnable для выполнения а.) есть «отдыхающий» поток, он выполнит заданный Runnable б.) все потоки пула «работают», ваш новый Runnable помещен в очередь BlockingQueue пула, ожидая выполнения

0 голосов
/ 09 января 2011

Вы можете также иметь 1 поток для загрузки изображений и список изображений для загрузки.

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

Теперь у вас есть классическая модель "производитель / потребитель"!

Надеюсь, это поможет,

...