-1
我使用Singleton來存儲對象的緩存,但每當我調用Singleton並添加到HashMap
時,它都沒有值。使用HashMap的Android/Java Singleton不保留HashMap值
高速緩存是在方法的開始時檢查(當大小爲1),但再次增加了HashMap
時,它的大小爲0。因此它的大小交替0
public class CachedObjects
{
static HashMap<String, Object> cachedObjects = new HashMap<>();
private static class InstanceHolder
{
private static final CachedObjects instance = new CachedObjects();
}
public static CachedObjects getInstance()
{
return CachedObjects.InstanceHolder.instance;
}
public void addObjectToCache(Object object)
{
cachedObjects.put(object.getTitle(), object);
}
public Object checkCacheForObject(String title)
{
Iterator it = cachedObjects.entrySet().iterator();
while (it.hasNext())
{
Map.Entry pair = (Map.Entry) it.next();
if (pair.getKey().equals(title))
{
return (Object) pair.getValue();
}
it.remove(); // avoids a ConcurrentModificationException
}
return null;
}
}
當它被稱爲:
所有的public Object getObjectInfoFrom(String title)
{
Object cachedObjectCheck = CachedObjects.getInstance().checkCacheForObject(title);
// Size of HashMap is usually 1 here
if (cachedObjectCheck != null)
{
return cachedObjectCheck ;
}
// Lots of DB fetching here
Object object = new Object(DB details above);
CachedObjects.getInstance().addObjectToCache(object);
// The size of the HashMap always seems to be empty here
return object;
}
您需要同步訪問地圖。閱讀javadoc中的hashmap,相關位在頂部以粗體顯示。 –
1)不要實施一個單身人士,他們是邪惡的。如果你不得不依賴於一個使用Android框架提供的僞單身 - 比如'Application'對象。 2)你的代碼沒有意義。 InstanceHolder類沒有任何用處,你的代碼過於複雜。 3)我會小心內存泄漏,我不能看到所有可能導致內存泄漏的關鍵代碼片段,但是代碼的結構肯定看起來像內存泄漏可能就在眼前。 –
@XaverKapeller什麼是單身人士的問題? – Vyacheslav