2013-12-18 54 views
4

我在Android中實現了一個存儲對象的標準LRUCache。每個鍵都是與存儲的對象關聯的唯一ObjectId。我的問題是從緩存中檢索對象的唯一方法是ObjectId(無迭代器)。實現getAll()方法的最佳方法是什麼? 另一個選擇是將所有的ObjectIds存儲在某個列表中,這樣我就可以迭代列表並獲取所有的對象 - 但是什麼是保存所有ObjectId的最佳方式?Android LRUCache檢索

謝謝!

回答

0

迭代LRU緩存中的對象是沒有意義的。你無法知道哪個對象仍然在緩存中,哪些被驅逐(你實際上可以,但那是另一回事)。聽起來好像你最好用不同的數據結構,比如Hashmap等等。什麼都不會從那裏驅逐。

一個常見的用例是在內存中包含所有可能的對象鍵的列表。如果你需要一個,你檢查它是否在緩存中。如果沒有,接收它並將其添加到緩存中。

+0

得到當前集合「這是沒有意義的遍歷LRU緩存中的對象「。那麼,這對我來說是有道理的,所以如果你知道如何去做,請分享你的知識。 (我有一個緩存可能包含蘋果和桔子的混合物,蘋果和橘子通常都是以同樣的方式對待,因此爲它們分開緩存並不是一個好主意,但是偶爾我必須接受所有的蘋果都壞了,所以我想驅逐蘋果,橘子還是可以的,所以我不想做一個evictAll()。) – RenniePet

+0

我同意 - 有一些有效的方案來迭代快照的緩存項目,無論快照中的某些項目是否可能在我們迭代它們時被驅逐。 – markproxy

6

如果您使用(或擴展)Android提供的LruCache,則它有一個返回鍵(您的ObjectIds)和值(您的對象)的映射的方法snapshot。你可以這樣做:如果你不使用Android的LruCache

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

,那麼我想這將取決於您的實現。 (我也很好奇是什麼促使你實現你自己的,而不是繼承所提供的一個了!)

1

使用快照的那一刻

lruCache.snapshot().values()