Sprawdziłem oficjalną dokumentację systemu Android dla LRUCache, która mówi: Za każdym razem, gdy uzyskuje się dostęp do wartości, jest ona przenoszona do nagłówka kolejki. Gdy wartość zostanie dodana do pełnej pamięci podręcznej, wartość na końcu tej kolejki zostanie wyeksmitowana i może się kwalifikować do zbierania śmieci. Przypuszczam, że jest to podwójnie połączona lista obsługiwana przez linkedhashmap, która jest używana przez pamięć podręczną. Aby sprawdzić to zachowanie, sprawdziłem kod źródłowy LruCache i sprawdziłem metodę get (K key) (). Ponadto wywołuje metodę get mapy, która pobiera wartość z podstawowej strategii i wywołuje metodę recordAccess.Zmiana kolejności wpisów LRUCache podczas używania get
public V get(Object key) {
LinkedHashMapEntry<K,V> e = (LinkedHashMapEntry<K,V>)getEntry(key);
if (e == null)
return null;
e.recordAccess(this);
return e.value;
}
metoda recordAccess z kolei przesuwa dostępnego wejście na końcu listy w przypadku accessOrder jest ustawiony na true (dla mojego problemu załóżmy to jest), bo inaczej nic nie robi.
/**
* This method is invoked by the superclass whenever the value
* of a pre-existing entry is read by Map.get or modified by Map.set.
* If the enclosing Map is access-ordered, it moves the entry
* to the end of the list; otherwise, it does nothing.
*/
void recordAccess(HashMap<K,V> m) {
LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
if (lm.accessOrder) {
lm.modCount++;
remove();
addBefore(lm.header);
}
}
Brzmi to sprzecznie z powyższym stwierdzeniem, w którym mówi się, że element został przeniesiony na czoło kolejki. Zamiast tego jest przenoszony do ostatniego elementu listy (używając head.before). Na pewno czegoś tu brakuje, jakiejkolwiek pomocy?
Nie mam pojęcia, jakie źródła są sprawdzane, widzę tylko to (https://android.googlesource.com/platform/frameworks/support.git/+/795b97d901e1793dac5c3e67d43c96a758fec388/v4/java/android/support /v4/util/LruCache.java#63) – pskink
Sprawdzam te same źródła, a faktyczne ponowne zamawianie odbywa się w klasie LinkedHashMap (ponieważ tam jest przechowywana lista), więc musisz przejść do map.get () metoda. –
ok, więc odnoszą się do jakiejś wirtualnej '' kolejki "', a nie do szczegółów implementacji 'LinkedHashMap' (odwzorowanie jest odwrócone) – pskink