Image cache, documentație Rusă Android
Încărcați o imagine într-o componentă de interfață cu utilizatorul, cu toate acestea, lucrurile devin mai complicate atunci când aveți nevoie pentru a descărca un set mare de imagini la un moment dat. De multe ori (în componente, cum ar fi ListView. GridView sau ViewPager) necesită chiar și o bară de derulare, deoarece imaginile pot fi fără sfârșit.
Utilizarea memoriei este redusă în cazul în care elementele de copil sunt eliminate imediat ce acestea sunt ascunse de pe ecran. Gunoier eliberează imaginile descărcate, presupunând că nu au nici referințe de lungă durată. Acest lucru este bine și bună, dar că interfața a lucrat fără probleme și rapid, poate doriți, pentru a evita procesarea constantă a acestor imagini, atunci când se întorc la ecranul. Memorie și memoria cache de disc de multe ori vin la salvare în astfel de situații, permițând componente pentru a încărca rapid imaginile prelucrate.
În această lecție vom vorbi despre utilizarea memoriei și memoria cache pe disc, pentru a obține o sensibilitate ridicată și interfața cu utilizatorul fără probleme în cazul încărcării unui număr mare de imagini.
Utilizarea memoriei cache
Notă: Ultimele sarcini de memorare în cache de imagini au fost populare clase SoftReference și WeakReference. dar acum nu este recomandat să le folosească. Începând cu Android 2.3 (API 9) colector de gunoi a devenit mai agresiv în lucrul cu colecții SoftReference / WeakReference, ceea ce le face ineficiente. În plus față de Android 3.0 (API 11) înapoi datele de imagine stocate în memoria nativă, care nu este eliminat moda previzibil, ceea ce ar putea duce la o epuizare a memoriei și crash aplicația.
Pentru a selecta dimensiunea potrivită pentru LruCache. trebuie să ia în considerare o serie de factori:
- În ceea ce privește memoria este utilizată pe scară largă în fenomenele și aplicarea?
- Cât de multe imagini ar trebui să fie vizibile pe ecran, în același timp? Câte imagini ar trebui să fie pregătite pentru imaginea imediată de pe ecran?
- Care este densitatea și dimensiunea ecranului de pe dispozitiv? Pe dispozitivele cu rezoluție ultra-înaltă (xhdpi), cum ar fi Galaxy Nexus, pentru stocarea imaginilor au nevoie de mai mulți bani decât pentru dispozitive cu rezoluție mai mică (hdpi).
- Care este rezoluția și configurația la imaginea și cât de multă memorie care le pot lua?
- Cât de des aveți nevoie pentru a accesa imaginile? Unele sunt mai multe sanse decat altele? poate doriți să stocați unele imagini sunt în mod constant în memorie, și poate chiar să creați mai multe obiecte LruCache pentru diferite grupuri de imagini.
- Puteți găsi un echilibru între cantitatea și calitatea? Uneori este mai convenabil pentru a stoca mai multe imagini cu o calitate mica, probabil prin descărcarea de versiuni mai mari, cu o sarcină separată.
Din păcate, nu există nici o formulă specială, care trebuie să adere la toate aplicațiile, este necesar să se analizeze datele brute și să ia măsurile corespunzătoare. Prea puțină memorie cache determină o sarcină suplimentară, fără nici un beneficiu, prea mult poate provoca java.lang.outOfMemory excepție și se lasă prea puțină memorie pentru restul cererii.
clasa de utilizare Exemplu LruCache pentru imagini:
Notă: atunci când inițializarea memoriei cache de disc necesită operații de disc și firul principal nu au nimic de a face. Cu toate acestea, acest lucru nu înseamnă că puteți accesa cache-ul înainte de a fi inițializat. Obiect-blocant, în exemplul de mai sus, se asigură că cererea nu poate citi datele din memoria cache pe disc înainte de pornirea cache.
La acel moment, deoarece memoria cache este verificată în fluxul principal, cache-ul de disc este verificat într-un fir separat. operațiunile de disc nu trebuie să fie efectuate în fluxul principal. încheierea tratamentului, imaginea finală este plasat direct în ambele cache.
modificări de configurație de procesare
Schimbare de configurație în timpul execuției, de exemplu, atunci când schimbă orientarea ecranului, având ca rezultat distrugerea și reporniți condițiile cu noua configurație (detalii în secțiunea de prelucrare Modificări de configurare în procesul de funcționare). probabil că doriți să evite re-procesarea imaginilor, astfel încât interfața a fost rapid, chiar și cu modificări în configurația dispozitivului.
Din fericire, în memoria cache stochează copii ale imaginilor pe care le-am creat în secțiunea anterioară a lecției. Memoria cache poate fi transferat la noua instanță a fenomenului atunci când se utilizează fragmente care sunt salvate atunci când apel setRetainInstance (adevărat). După recrearea fragmentul stocat evenimente este atașat și aveți acces la obiectele existente în memoria cache. Acest lucru vă permite să ciclu rapid prin imagine și le-a pus în componentele ImageView corespunzătoare.
Aplicație Exemplu LruCache obiect prin modificarea configurației, folosind fragmentele: