2015-08-12 4 views
30

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

ответ

120

Какое влияние это будет на производительность приложения и память?

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

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

  • Если вы не используете with(getActivity().getApplicationContext()) ничего не произойдет, все 3MBs данных загружается и затем декодируется, кэшируются, возможно, даже установить в 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); 
    } 
} 

и использование это от деятельности/фрагмента:

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

Удивительного объяснения! Это сэкономило мне много времени, чтобы выяснить, что является основной причиной частого исключения OOM. Спасибо! – user1774316

+0

Могу ли я передать контекст фрагмента в адаптер как «mContext» и использовать «glide.with (mContext) ...» в адаптере? – squeeish

+0

@Terence Конечно, но это то же самое, что и 'getActivity()', поэтому, если вы замените фрагмент транзакцией, ресурсы не будут выпущены до тех пор, пока пользователь полностью не покинет эту активность. Если вам нужен «mContext» по другим причинам (например, 'getString'), вы можете просто использовать' anyView.getContext() '. – TWiStErRob

0

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

if (!this.isFinishing()) { 
     Glide.with(this)... 
} 
Смежные вопросы