Android LRUCache 检索

5
我已在Android中实现了一个标准的LRUCache来存储对象。每个键都是与存储的对象关联的唯一ObjectId。我的问题是,从缓存中检索对象的唯一方法是通过ObjectId(没有迭代器)。如何最好地实现一个getAll()方法呢? 另一种选择是将所有的ObjectIds存储在某个列表中,以便我可以遍历列表并获取所有的对象 - 但是什么是持有所有ObjectIds的最佳方式?
谢谢!
3个回答

6

如果您正在使用(或扩展)Android提供的LruCache,它有一个snapshot方法,返回一个键(您的ObjectIds)和值(您的Objects)的映射。您可以像这样执行:

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

如果您没有使用Android的LruCache,那么我想这将取决于您的实现方式。(我也很好奇是什么激发了您自己实现而不是子类化提供的缓存!)

这不似乎是一个好的解决方案。一旦执行lruCache.get(),该特定条目就会被放置在队列的头部。 - gaurav414u

5
使用快照获取当前集合的状态。
lruCache.snapshot().values()

-1

在 LRU 缓存中迭代对象是没有意义的。您无法知道哪个对象仍然在缓存中,哪个被驱逐了(实际上您可以,但那是另一回事)。听起来您最好使用不同的数据结构,如哈希表等。从哈希表中不会有任何东西被驱逐。

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


在LRU缓存中迭代对象是没有意义的。虽然对我来说有意义,如果您知道如何做,请分享您的知识。(我有一个缓存,其中可能包含苹果和橙子的混合物。苹果和橙子通常以相同的方式处理,因此为它们分别设置单独的缓存不是一个好主意。但是偶尔所有的苹果都变坏了,所以我想驱逐苹果。橙子还可以,所以我不想执行evictAll()。) - RenniePet
我同意--无论快照中的某些项在我们迭代它们时是否已被驱逐,都存在迭代缓存项快照的有效场景。 - Mark McClelland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接