我阅读了一些使用lrucache实现用于存储位图图像的缓存机制的示例。但我仍然不知道如何使用它,即使我已经阅读了http://developer.android.com/reference/android/util/LruCache.html文档。
例如,在document中,它在size of()中提到“以用户定义的单位返回键和值的条目大小”。入口的大小意味着什么?它是指它允许的条目数,例如return 10允许我有10个缓存对象引用。

public class LruBitmapCache extends LruCache<String, Bitmap> implements
    ImageCache {
public static int getDefaultLruCacheSize() {
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8;

    return cacheSize;
}

public LruBitmapCache() {
    this(getDefaultLruCacheSize());
}

public LruBitmapCache(int sizeInKiloBytes) {
    super(sizeInKiloBytes);
}

@Override
protected int sizeOf(String key, Bitmap value) {
    return getByteCount / 1024;
...

在上面的代码中,为什么它需要除以1024,它的建议是什么?
另外,构造函数lrubitmapcache(int sizeinkilobytes),为什么参数声明它是以千字节为单位的大小?根据上面的文档,它不应该是字节大小吗?
任何帮助都将不胜感激,谢谢!我很困惑…

最佳答案

lrucache用于缓存有限数量的值。
但是这个有限的值是多少呢?
第一个选项:您希望将x元素存储在缓存中,不管它们在内存中的大小如何。
在本例中,只需创建一个LruCache并将x作为大小,而不重写sizeOf方法。
例如:

// cache 1000 values, independently of the String size
LruCache<Integer, String> idToCustomerName = new LruCache<>(1000);

第二个选项,您希望存储元素,以便所有元素的大小之和不超过给定的数量。
在本例中,创建一个LruCache并将y作为总大小,并且覆盖指定缓存中一个元素大小的sizeOf
例如:
// cache an undefined number of ids so that the length of all the strings
// do not exceed 100000 characters
LruCache<Integer, String> idToCustomerName = new LruCache<>(100000) {
    @Override
    protected int sizeOf(Integer key, String value) {
       return value.length();
    }
};

要回答有关代码的问题,只要maxSize变量和sizeOf是同一个单元,缓存中使用的单元就不重要。
在您的示例中,缓存的内部单位是千字节,因此在代码中可以看到/1024/8,这与getByteCount / 1024;方法中的sizeOf匹配。

关于java - 如果在使用LruCache类时不覆盖sizeof会发生什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25608497/

10-09 05:19