Я использую скольжение для загрузки изображений в моем приложении для Android, чтобы избежать каких-либо сбоев. Я загружаю изображения с помощью контекста приложения. Каким будет эффект от работы приложения и памяти?
Загрузка изображения с использованием приложения
Ответ 1
Как это повлияет на производительность приложения и памяти?
Glide предоставляет множество методов .with()
по одной причине: он следует за жизненным циклом.
Представьте себе Fragment
, который динамически добавляется в Activity. В своем методе onCreateView
он запускает загрузку Glide изображения 3 МБ. Теперь, что, если пользователь нажимает кнопку "Назад", а фрагмент удаляется или вся активность закрыта?
- Если вы используете
with(getActivity().getApplicationContext())
, ничего не произойдет, все 3 МБ данных будут загружены, а затем будут декодированы, кэшированы, возможно, даже установлены в ImageView, а затем собраны мусор, потому что единственная ссылка на него - из внутренних функций Glide. - Если вы используете
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));
Ответ 2
Это работало для меня при загрузке изображения:
if (!this.isFinishing ()) {
Glide.with(this)...
}
Ответ 3
Но почему Glide нужен фрагмент вместо владельца жизненного цикла?