Загрузка сглаживания изображений с использованием контекста приложения

Я использую скольжение для загрузки изображений в моем приложении Android, чтобы избежать каких-либо сбоев. Я загружаю изображения с помощью контекста приложения. Каким будет эффект от работы приложения и памяти?

Каким будет эффект от работы приложения и памяти?

Glide предоставляет так много методов .with() по какой-либо причине: это следует за жизненным циклом.

Представьте Fragment который динамически добавляется в Activity. В методе onCreateView он запускает загрузку Glide изображения 3 МБ. Теперь, что, если пользователь нажимает кнопку «Назад», а фрагмент удаляется или вся активность закрыта?

  • Если вы используете with(getActivity().getApplicationContext()) ничего не произойдет, все 3 МБ данных будут загружены, а затем декодированы, кэшированы, возможно, даже настроены на ImageView, а затем собрано мусор, поскольку единственная ссылка на это была от Скользящие внутренние детали.
  • Если вы используете with((Fragment)this) Glide присоединяется к событиям жизненного цикла фрагмента и как только Фрагмент остановлен, любой невыполненный запрос должен быть приостановлен; И когда они уничтожены, все ожидающие запросы будут очищены. Это означает, что загрузка изображения остановится на полпути, и этот мертвый фрагмент не будет использоваться больше ресурсов.
  • Если вы используете with(getActivity()) Glide присоединяется к событиям жизненного цикла Activity, а одно и то же происходит, как описано выше, но только при остановке или уничтожении Activity.

Поэтому наилучшей практикой является использование максимально возможного контекста / фрагмента, чтобы избежать неиспользуемых запросов. (Существует также ручной способ остановки загрузки: Glide.clear(ImageView|Target) .)


Чтобы применить это на практике, попробуйте использовать with(this) возможно), когда это возможно, но когда это не так, как в адаптере, или метод централизованной загрузки изображений, перейдите в RequestManager glide в качестве аргумента и используйте glide.load(... , например:

 static loadImage(RequestManager glide, String url, ImageView view) { glide.load(url).into(view); } 

Или в адаптере:

 class MyAdapter extends WhichEveryOneYouUse { private final RequestManager glide; MyAdapter(RequestManager glide, ...) { this.glide = glide; ... } void getView/onBindViewHolder(... int position) { // ... holder magic, and get current item for position glide.load... or even loadImage(glide, item.url, holder.image); } } 

И используйте их из Activity / Fragment:

 loadImage(Glide.with(this), url, findViewById(R.id.image)); // or list.setAdapter(new MyAdapter(Glide.with(this), data)); 

Это работало для меня при загрузке изображения:

 if (!this.isFinishing ()) { Glide.with(this)... }