如果我在使用LruCache类时不覆盖sizeof会发生什么

时间:2014-09-01 14:55:24

标签: java android

我使用LruCache读取了一些示例,以实现用于存储位图图像的缓存机制。但即使我已阅读文档http://developer.android.com/reference/android/util/LruCache.html,我仍然不知道如何使用它。
例如,在文档中,它提到了"以用户定义的单位返回键和值的条目大小。"在sizeof()。入门的大小是多少?它是否意味着它允许的条目数,例如,返回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),为什么参数声称它的大小以千字节为单位?根据上面的文档,它不应该是字节大小吗?

任何帮助将不胜感激,谢谢!我很困惑......

1 个答案:

答案 0 :(得分:3)

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相匹配方法。