кеширане на изображението, руски документация андроид

Качване на снимка на потребителски интерфейс компонент, обаче, нещата стават по-сложни, когато трябва да си изтеглите голям набор от изображения в даден момент. Често (в компоненти като ListView. Гледания или ViewPager) дори да изисква лента за превъртане, изображенията могат да бъдат безкрайни.

използването на паметта се намалява, ако елементите на деца са отстранени веднага след като те са скрити от екрана. Събирачът освобождава Прехвърлените снимки, като се предполага, че не разполагат с никакви дълголетни препратки. Всичко това е много хубаво, но че интерфейсът работи гладко и бързо, може да искате да се избегне постоянното обработката на тези образи, когато се върнат на екрана. Памет и кеша на диска често се притече на помощ в такива ситуации, което позволява на компоненти за бързо зареждат обработените изображения.

В този урок ще говорим за използването на паметта и кеша на диска, за да се получи висока чувствителност и гладка потребителски интерфейс в случай на зареждане на голям брой изображения.

С нейна помощ

Забележка: последните задачи с изображения кеширане бяха популярни класове SoftReference и WeakReference. но сега това не се препоръчва да ги използвате. Започвайки с Android 2.3 (API 9) боклукчията е станал по-агресивен в работата с колекции SoftReference / WeakReference, което ги прави неефективни. В допълнение към Android 3.0 (API 11) данни с изображение, съхранявани в родния паметта, която не се изчиства предсказуем начин, което би могло да доведе до изчерпване на паметта и катастрофата на заявлението.

За да изберете подходящия размер за LruCache. трябва да се вземат предвид редица фактори:

  • Що се отнася до паметта се използва широко в явленията и прилагането?
  • Колко снимки трябва да се вижда на екрана по едно и също време? Колко снимки трябва да бъдат подготвени за незабавно изображение на екрана?
  • Какво е плътността и размера на екрана на устройството? На устройства с ултра-висока резолюция (xhdpi), подобно на Galaxy Nexus, за съхраняване на изображения се нуждаят от повече пари, отколкото за устройства с резолюция по-малка (hdpi).
  • Каква е резолюцията и конфигурацията на изображението и колко памет може да отнеме?
  • Колко често трябва да имат достъп до изображения? Някои от тях са по-склонни от други? Вие може да искате да се съхраняват някои от снимките са постоянно в паметта, а може би дори да създадете множество обекти LruCache за различни групи от изображения.
  • Можете да се намери баланс между количеството и качеството? Понякога е по-удобно да се съхраняват повече снимки с малко качество, може би чрез изтеглянето на по-големи версии с отделна задача.

Уви, не е специална формула, която трябва да се придържат към всички приложения, е необходимо да се анализират суровите данни и предприемат необходимите действия. Твърде малко кеш причинява допълнителен товар, без никакви ползи, твърде много може да предизвика java.lang.outOfMemory изключение и оставят твърде малко памет за останалата част от приложението.

Пример използване LruCache клас за изображения:

Забележка: при инициализиране на дисковия кеш изисква дисковите операции и основната нишка, те нямат нищо общо. Все пак, това не означава, че можете да получите достъп до кеш, преди да се инициализира. Обектно-блокер в примера по-горе, да гарантира, че приложението не може да чете данни от кеша на диска, преди да е започнало кеша.

По това време, като кеш паметта се проверява в главния поток, кеш диск се проверява в отделна нишка. дисковите операции никога не трябва да се извършват в основния поток. завършване Лечение, окончателното изображение се поставя директно в двете кеша.

промени в конфигурацията Обработка

промяна на конфигурацията по време на изпълнението, например при смяна на ориентацията на екрана, което води до унищожаване и рестартирайте течаща условия с новата конфигурация (подробности в обработката Конфигурацията Промени в процеса). Може би искате да се избегне повторната обработка на изображения, така че интерфейсът е бързо, дори и с промени в конфигурацията на устройствата.

За щастие, в кеш паметта съхранява копия от изображенията, които създадохме в предишния раздел на урока. Кешът може да бъде прехвърлена към новото място на явлението при използване на фрагменти, които се запазват, когато се обаждате setRetainInstance (вярно). След пресъздаване на събитията съхранява фрагмент е приложен и имате достъп до съществуващи обекти в кеша. Това ви позволява бързо да преминете през образа и ги поставя в съответните компоненти ImageView.

Пример за приложение LruCache обект чрез промяна на конфигурацията, като се използват фрагменти: