2011-08-31 8 views
30

Utworzyłem GalleryView i ImageView, który wyświetla większy obraz po kliknięciu elementu w galerii. Użyłem poniższy kod do wdrożenia ImageAdapter:Jaki jest pożytek z metody recycle() w TypedArray

public ImageAdapter(Context c) 
{ 
    context = c; 
    TypedArray a = obtainStyledAttributes(R.styleable.gallery1); 
    itemBackground = a.getResourceId(R.styleable.gallery1_android_galleryItemBackground, 0);  
    a.recycle();  
} 

Kiedy usunąłem oświadczenie a.recycle() istnieje żadna zmiana, a aplikacja jest uruchomiona normalnie, jak poprzednio, ale wszędzie czytam, że obowiązkowe jest zawracanie TypedArray. Kiedy nie ma zmian w sposobie, w jaki działa moja aplikacja, jest to, co jest metodą recycle().

Czy ktoś może mi wyjaśnić szczegółowo. Dziękuję Ci.

Odpowiedz

25

Punkt jest podobny do pomysłu wyczyszczenia wskaźnika w języku C (jeśli jesteś o tym obeznany). Służy do tworzenia danych związanych z "a" gotowych do wyrzucenia śmieci, więc pamięć/dane nie są nieefektywnie powiązane z "a", kiedy nie musi być. Czytaj więcej here. Ważne jest, aby pamiętać, że nie jest to konieczne, chyba że używasz ponownie "a". GC powinien automatycznie wyczyścić te dane, jeśli obiekt nie zostanie ponownie użyty. Powodem, dla którego zmienna TypedArray jest inna, jest to, że TypedArray ma inne wewnętrzne dane, które muszą zostać zwrócone (znane jako StyledAttributes) do TypedArray w celu późniejszego ponownego użycia. Przeczytaj o tym here.

+2

Uwaga boczna: GC oznacza "wywóz śmieci". – Vinay

+3

Nie rozumiem. Ostatni odsyłacz sprawia, że ​​wywołanie recycle() umożliwia ponowne użycie wewnętrznej tablicy. Czy nie oznacza to, że uniemożliwia to zbieranie tablicy GC?Dlaczego mówisz, że czyni dane związane z "a" gotowymi na GC? – gsingh2011

+0

@ gsingh2011 umożliwia "ponowne użycie przez późniejszego dzwoniącego". Prawdą jest, że treść dokumentacji jest nieco niezręczna, ale to, co robią, polega na tym, że pamięć skojarzona z 'TypedArray' może być ponownie użyta przez późniejszego wywołującego (nie sama instancja, jak rozumiesz to w granicach twojego programu). Dlatego w dokumentacji jest napisane: "Po wywołaniu tej funkcji nie wolno ponownie dotykać tablicy.". – Vinay

5

Urządzenie recycle() powoduje, że przydzielona pamięć zostanie natychmiast zwrócona do dostępnej puli i nie zostanie w niej do czasu usunięcia. Ta metoda jest również dostępna dla Bitmap.

0

recykling w zasadzie oznacza .. bezpłatne/wyczyszczenie wszystkich danych powiązanych z odpowiednim zasobem. W Androidzie możemy znaleźć recykling dla Bitmap i TypedArray.

Po sprawdzeniu obu plików źródłowych można znaleźć zmienną binarną "mRecycled", która jest "false" (wartość domyślna). Jest przypisany do "true", gdy wywoływany jest recycle.

Teraz, jeśli sprawdzasz tę metodę (metodę recyklingu w obu klasach), wówczas możesz zauważyć, że czyści wszystkie wartości.

Tutaj znajdą Państwo metody.

Bitmap.java:

public void recycle() { 
    if (!mRecycled && mNativePtr != 0) { 
     if (nativeRecycle(mNativePtr)) { 
      // return value indicates whether native pixel object was actually recycled. 
      // false indicates that it is still in use at the native level and these 
      // objects should not be collected now. They will be collected later when the 
      // Bitmap itself is collected. 
      mBuffer = null; 
      mNinePatchChunk = null; 
     } 
     mRecycled = true; 
    } 
} 

TypedArray.java

public void recycle() { 
    if (mRecycled) { 
     throw new RuntimeException(toString() + " recycled twice!"); 
    } 

    mRecycled = true; 

    // These may have been set by the client. 
    mXml = null; 
    mTheme = null; 
    mAssets = null; 

    mResources.mTypedArrayPool.release(this); 
} 

ta linia

mResources.mTypedArrayPool.release(this); 

wyda TypedArray z SunchronisedPool którego wartość domyślna wynosi 5. Więc nie powinien ponownie używać tego samego typedArray, ponieważ zostanie wyczyszczony.

Gdy "mRecycled" z TypeedArray jest prawdziwe, to podczas pobierania jego własności rzuci RuntimeException, mówiąc "Nie można wykonywać połączeń z poddanymi recyklingowi!".

Podobnie zachowują się zachowania bitmapowe. Mam nadzieję, że to pomaga.

Powiązane problemy