Я пытаюсь создать загрузчик ленивых изображений для изображений как с устройства, так и из Интернета для ListView
.
Я думаю о том, что использовать и как, с одной стороны, я могу использовать поток, который объединяет мой запрос (всегда выполняется, и я могу прикрепить представление и адаптер, и он будет обрабатывать загрузку изображения для меня), кэшировать уже загруженные изображения и проверяет видимость изображений перед загрузкой, поэтому я не буду выполнять ненужную работу.
У меня была еще одна мысль об использовании AsyncTask
, как многие предлагают на форуме. Однако есть один недостаток. Я вижу, что многие используют new MyTask().execute(urls);
, это создает проблему, если я хочу начать загрузку и прекратить загрузку изображений по требованию.
Если я использую асинхронную задачу для каждого изображения, тогда мне нужно новое асинхронное задание для каждого изображения, это много нового, что я могу сделать, я могу использовать пул, но если слишком много асинхронных задач застрянет, я все равно создаю около 150- 200 асинхронных заданий, слишком много на мой вкус ...
Что вы, ребята, думаете? Я думаю, что нить сделает лучше работу здесь:
- Продолжайте бежать, пока не убьете
- Попробуйте получить работу из очереди, если не работы, подождите.
- Если задание доступно, получите его и начните обработку.
- Каждый запрос обрабатывается отдельно, последовательно и блокирует поток.
- После того, как все продолжается с "2".
- Каждая постановка в очередь, выполняемая адаптером с использованием
startLoadingImage()
для представлений, которые необходимо отобразить, создаст новое задание и вызовет уведомление при блокировке ожидания.
Я могу оптимизировать этот код с помощью пула потоков, если мне нужно несколько запросов GET \ POST параллельно.
Также я кеширую уже загруженные \ загруженные изображения для быстрой загрузки при следующем доступе. Идея состоит в том, чтобы минимизировать GC и отставание списков.