【问题标题】:what happen if I don't override sizeof when using LruCache class如果我在使用 LruCache 类时不覆盖 sizeof 会发生什么
【发布时间】:2014-09-01 23:20:59
【问题描述】:

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

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

【问题讨论】:

    标签: java android


    【解决方案1】:

    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,它们与 sizeOf 方法中的 getByteCount / 1024; 匹配。

    【讨论】:

    • 谢谢。我明白你的意思,只要maxSizesizeOf 的单位相同,一切都会正常进行。但是在你对第二个选项的解释中,当我关心所有元素总和的总大小时,我仍然有些困惑。在您的代码中,sizeOf 返回value.length()。如果我在LruCache 中有 4 个项目,它们的大小不同,它们是 100,200,300,400 是否主要。然后,总数为 1000。假设我将 maxSize 设置为 100000,例如 LruCache&lt;&gt;(100000)。那么,所有 4 个项目都可以存储在缓存中,对吧?
    • 没错。现在,如果您有 50000,然后是 30000,然后是 40000,则太多(总和为 110000),因此将从缓存中逐出最近最少使用的值,以便为新值腾出空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多