Может ли кто-нибудь сказать мне, как создать хороший механизм для асинхронизации. загрузка изображений для использования в ListView / GridView?
Есть много предложений estions , но каждая из них учитывает лишь небольшую часть типичных требований.
Ниже я перечислил некоторые разумные факторы (требования или вещи, которые необходимо учитывать), которые я и мои коллеги не в состоянии удовлетворить сразу.
Я не прошу код (хотя он будет приветствоваться), а просто подход, который управляет растровыми изображениями, как описано.
- Отсутствие дублирования загрузчиков или растровых изображений
- Отмена загрузки / назначения изображений, которые больше не нужны или могут быть автоматически удалены (SoftReference и т. Д.)
- Примечание: адаптер может иметь несколько представлений для тот же идентификатор (вызовы getView (0) очень часты)
- Примечание: нет гарантии, что представление не будет потеряно вместо повторного использования (рассмотрите изменение размера List / GridView или фильтрацию по тексту)
- Разделение представлений и данные / логика (насколько это возможно)
- Отсутствие запуска отдельного потока для каждой загрузки (видимое замедление пользовательского интерфейса). Используйте очередь / стек (BlockingQueue?) И пул потоков или что-то в этом роде ... но нужно прекратить это, если действие остановлено.
- Очистка растровых изображений, достаточно удаленных от текущей позиции в списке / сетке, предпочтительно только тогда, когда требуется память.
- Вызов recycle () для каждого растрового изображения, которое должно быть отброшено.
- Примечание. Внешняя память может быть недоступна (вообще или постоянно) и, если она используется, должна быть очищена (только от загруженных здесь изображений) как можно скорее (рассмотрите возможность уничтожения / восстановления действий Android).
- Примечание. : Данные могут быть изменены: записи удаляются (множественный выбор и удаление) и добавляются (в фоновой теме). Уже загруженные растровые изображения следует хранить до тех пор, пока существуют записи, с которыми они связаны.
- setTextFilterEnabled (true) (если основан на механизме ArrayAdapter, повлияет на индексы массива)
- Используется в ExpandableList (влияет на порядок отображения эскизов)
- (необязательно) при загрузке Bitmap обновлять ТОЛЬКО соответствующий ImageView (элементы списка могут быть очень сложными)
Пожалуйста, не публикуйте ответы по отдельным пунктам. Моя проблема в том, что чем больше мы сосредотачиваемся на некоторых аспектах, тем более размытыми становятся другие , подобные Гейзенбергу .
Каждый добавляет измерение сложности, особенно Bitmap.recycle, который необходимо вызывать во время работы и при уничтожении Activity (обратите внимание, что onDestroy, даже onStop могут не вызываться).
Это также исключает использование SoftReferences .
Это необходимо , иначе я получаю OutOfMemoryError даже после любого количества gc, sleep (даже 20 секунд), yield и выделения огромных массивов в try-catch (для принудительного управления OutOfMemory) после обнуления Bitmap.
Я уже передискретизирую растровые изображения.
задан Community 23 May 2017 в 11:48
поделиться