【问题标题】:Android LRUCache RetrievalAndroid LRUCache 检索
【发布时间】:2014-01-07 05:33:50
【问题描述】:

我在 Android 中实现了一个标准的 LRUCache 来存储对象。每个键都是与存储的对象关联的唯一 ObjectId。我的问题是从缓存中检索对象的唯一方法是通过 ObjectId(无迭代器)。实现 getAll() 方法的最佳方法是什么? 另一种选择是将所有 ObjectId 存储在某个列表中,这样我就可以遍历列表并获取所有 Object - 但是保存所有 ObjectId 的最佳方式是什么?

谢谢!

【问题讨论】:

    标签: android caching iterator lru android-lru-cache


    【解决方案1】:

    遍历 LRU 缓存中的对象是没有意义的。您无法知道哪个对象仍在缓存中,哪个对象被驱逐(实际上可以,但那是另一回事了)。听起来您可能最好使用不同的数据结构,例如 Hashmap 左右。任何东西都不会被从那里驱逐出去。

    一个常见的用例是在内存中拥有一个包含所有可能对象键的列表。如果需要,请检查它是否在缓存中。如果没有,则接收它并将其添加到缓存中。

    【讨论】:

    • “迭代 LRU 缓存中的对象没有意义。”嗯,这对我来说很有意义,所以如果你知道怎么做,请分享你的知识。 (我有一个缓存可能包含苹果和橙子的混合物。苹果和橙子通常以相同的方式处理,因此为它们设置单独的缓存不是一个好主意。但有时我不得不接受这一点所有的苹果都坏了,所以我想驱逐苹果。橙子还可以,所以我不想做 evictAll()。)
    • 我同意 - 存在用于迭代缓存项目快照的有效方案,无论快照中的某些项目在我们迭代它们时是否已被逐出。跨度>
    【解决方案2】:

    如果您正在使用(或扩展)Android 提供的LruCache,它有一个snapshot 方法,可返回键(您的ObjectId)和值(您的对象)的映射。你可以这样做:

    Map<ObjectIds, Object> snapshot = lruCache.snapshot();
    for (ObjectIds id : snapshot.keySet()) {
      Object myObject = lruCache.get(id);
    }
    

    如果您不使用 Android 的 LruCache,那么我想这将取决于您的实现。 (我也很好奇是什么促使您实现自己的而不是继承提供的子类!)

    【讨论】:

      【解决方案3】:

      使用快照获取当前集合

      lruCache.snapshot().values()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-11
        • 2013-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多