Асинхронная загрузка растровых изображений в адаптере с упором на Bitmap.recycle ()

Может ли кто-нибудь сказать мне, как создать хороший механизм для асинхронизации. загрузка изображений для использования в ListView / GridView? Есть много предложений estions , но каждая из них учитывает лишь небольшую часть типичных требований.

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

  1. Отсутствие дублирования загрузчиков или растровых изображений
  2. Отмена загрузки / назначения изображений, которые больше не нужны или могут быть автоматически удалены (SoftReference и т. Д.)
  3. Примечание: адаптер может иметь несколько представлений для тот же идентификатор (вызовы getView (0) очень часты)
  4. Примечание: нет гарантии, что представление не будет потеряно вместо повторного использования (рассмотрите изменение размера List / GridView или фильтрацию по тексту)
  5. Разделение представлений и данные / логика (насколько это возможно)
  6. Отсутствие запуска отдельного потока для каждой загрузки (видимое замедление пользовательского интерфейса). Используйте очередь / стек (BlockingQueue?) И пул потоков или что-то в этом роде ... но нужно прекратить это, если действие остановлено.
  7. Очистка растровых изображений, достаточно удаленных от текущей позиции в списке / сетке, предпочтительно только тогда, когда требуется память.
  8. Вызов recycle () для каждого растрового изображения, которое должно быть отброшено.
  9. Примечание. Внешняя память может быть недоступна (вообще или постоянно) и, если она используется, должна быть очищена (только от загруженных здесь изображений) как можно скорее (рассмотрите возможность уничтожения / восстановления действий Android).
  10. Примечание. : Данные могут быть изменены: записи удаляются (множественный выбор и удаление) и добавляются (в фоновой теме). Уже загруженные растровые изображения следует хранить до тех пор, пока существуют записи, с которыми они связаны.
  11. setTextFilterEnabled (true) (если основан на механизме ArrayAdapter, повлияет на индексы массива)
  12. Используется в ExpandableList (влияет на порядок отображения эскизов)
  13. (необязательно) при загрузке Bitmap обновлять ТОЛЬКО соответствующий ImageView (элементы списка могут быть очень сложными)

Пожалуйста, не публикуйте ответы по отдельным пунктам. Моя проблема в том, что чем больше мы сосредотачиваемся на некоторых аспектах, тем более размытыми становятся другие , подобные Гейзенбергу .
Каждый добавляет измерение сложности, особенно Bitmap.recycle, который необходимо вызывать во время работы и при уничтожении Activity (обратите внимание, что onDestroy, даже onStop могут не вызываться).
Это также исключает использование SoftReferences .
Это необходимо , иначе я получаю OutOfMemoryError даже после любого количества gc, sleep (даже 20 секунд), yield и выделения огромных массивов в try-catch (для принудительного управления OutOfMemory) после обнуления Bitmap.
Я уже передискретизирую растровые изображения.

7
задан Community 23 May 2017 в 11:48
поделиться