Отмена запроса изображения Android на основе прогресса - загрузчик изображений Volley, Picasso
В Github доступно множество популярных загрузчиков изображений для загрузки и кэширования изображений, а также для управления запросами изображений.
Я столкнулся с требованием, если Imageview, если он больше не прикреплен к окну, запрос (партия и полет) будет отменен.
Однако виджет прокрутки, такой как Listview и Gridview, Imageview часто присоединяется и отсоединяется от окна, поэтому запрос в очереди отменяется соответственно.
Меня беспокоит то, что у них нет механизма для отслеживания хода выполнения запроса изображения во всей вышеуказанной библиотеке. Если Imageview отключен, запрос должен быть отменен на основе прогресса, если поток байтов a уже выполнил 75% работы, то он не должен быть отмененным, что, в свою очередь, уменьшит пропускную способность сети и уменьшит сетевой вызов, так как обычно пользователь всегда много прокручивает в виджете прокрутки, как Listview, Gridview и т. д.
Вот мое понимание с волейболом:
public boolean removeContainerAndCancelIfNecessary(ImageContainer container) {
/* logic to check progress of Request */
mContainers.remove(container);
if (mContainers.size() == 0) {
mRequest.cancel();
return true;
}
return false;
}
Вот мое понимание с Пикассо:
private void cancelExistingRequest(Object target) {
checkMain();
Action action = targetToAction.remove(target);
if (action != null) {
action.cancel();
dispatcher.dispatchCancel(action);
}
if (target instanceof ImageView) {
ImageView targetImageView = (ImageView) target;
DeferredRequestCreator deferredRequestCreator = targetToDeferredRequestCreator.remove(targetImageView);
if (deferredRequestCreator != null) {
deferredRequestCreator.cancel();
}
}
}
Вот мое понимание использования Universal Image Loader: я не рассчитывал, что Universal Image Loader разрешает отменить встроенный запрос.
void cancelDisplayTaskFor(ImageAware imageAware) {
cacheKeysForImageAwares.remove(imageAware.getId());
}
Пожалуйста, дайте мне знать, чтобы решить эту проблему только для запроса сети. Если изображение уже кэшировано, мы отменим запрос.
Производительность батареи действительно важна в Android
1 ответ
Я не могу сказать о Волли и Пикассо, но я могу сказать, как работает UIL.
UIL постоянно проверяет ImageView во время обработки задачи. Если задача становится неактуальной (ImageView перерабатывается (повторно используется) или собирается GC), тогда UIL останавливает задачу для этого ImageView.
Что делать, если задача становится неактуальной при загрузке изображения? UIL прерывает загрузку, если было загружено менее 75% данных изображения. Если более 75% - тогда UIL завершает загрузку (то есть UIL кэширует файл образа в кеше диска) и затем отменяет задачу.