2016-08-03 4 views
2

Ich versuche, ein 2-jähriges Tutorial auf Android in Bezug auf die Verwendung von LruCache und einige Samples, die ich bisher gegoogled habe die gleiche Methode, die einen Wert (int) übergeben wird, zu konvertieren KiB.Android LruCache Cachegröße Parameter

final int maxMemory = (int)(Runtime.getRuntime().maxMemory()/1024); 
final int cacheSize = maxMemory/8; //use 1/8th of what is available 
imageCache = new LruCache<>(cacheSize); 

jedoch aus dem Google-Dokumentation genommen, wie, scheint der übergebene int Wert in den Bytes umgewandelt werden (von MiB): https://developer.android.com/reference/android/util/LruCache.html

int cacheSize = 4 * 1024 * 1024; // 4MiB 
LruCache<String, Bitmap> bitmapCache = new LruCache<String, Bitmap>(cacheSize) { 
    protected int sizeOf(String key, Bitmap value) { 
     return value.getByteCount(); 
    } 
} 

Ich möchte wissen, was man die richtige Einheit Messung. Alle Antworten würden sehr geschätzt werden.

Antwort

2

Ein LruCache verwendet die Methode sizeOf, um die aktuelle Größe des Caches zu bestimmen, und ob der Cache voll ist oder nicht. (d. h. sizeOf wird für jedes Element im Cache aufgerufen und addiert, um die Gesamtgröße zu bestimmen). Daher hängt der korrekte Wert für den Konstruktor von der Implementierung von sizeOf ab.

Standardmäßig gibt sizeOf immer 1 zurück, was bedeutet, dass die im Konstruktor angegebene int maxSize einfach die Anzahl der Elemente ist, die der Cache enthalten kann. In diesem Beispiel wurde sizeOf überschrieben, um die Anzahl der Bytes in jeder Bitmap zurückzugeben. Daher ist die int maxSize im Konstruktor die maximale Anzahl von Bytes, die der Cache enthalten sollte.

+0

Verstanden! Vielen Dank! Dann müsste ich stattdessen die sizeOf-Methode überschreiben. Es gab keine Erwähnung davon mit dem Tutorial, dem ich folge, es ist wahrscheinlich schon eine ältere Methode. – Rei

1

Was Sie folgende stammt aus https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

Wie Sie sehen können, der Grund ist, dass LruCache einen int benötigt. Da der Speicher zu groß sein kann, um Bytes mit Ints zu adressieren, berücksichtigt er stattdessen Kilobyte. Also:

final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024); 
// Use 1/8th of the available memory for this memory cache. 
final int cacheSize = maxMemory/8; 

Aber auch in der gleichen Ausbildung,

protected int sizeOf(String key, Bitmap bitmap) { 
    // The cache size will be measured in kilobytes rather than 
    // number of items. 
    return bitmap.getByteCount()/1024; 
} 

Die Größe der Bitmap wird auch in Kilo-Bytes ausgedrückt.

In der Klassendokumentation verwendet der Autor Bytes, weil 4.2^20 in ein int passt.