Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 нужен фрагмент вместо владельца жизненного цикла?