2016-12-05 55 views
-1

我使用Singleton來存儲對象的緩存,但每當我調用Singleton並添加到HashMap時,它都沒有值。使用HashMap的Android/Java Singleton不保留HashMap值

高速緩存是在方法的開始時檢查(當大小爲1),但再次增加了HashMap時,它的大小爲0。因此它的大小交替0

和1之間。
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; 
    } 
+0

您需要同步訪問地圖。閱讀javadoc中的hashmap,相關位在頂部以粗體顯示。 –

+0

1)不要實施一個單身人士,他們是邪惡的。如果你不得不依賴於一個使用Android框架提供的僞單身 - 比如'Application'對象。 2)你的代碼沒有意義。 InstanceHolder類沒有任何用處,你的代碼過於複雜。 3)我會小心內存泄漏,我不能看到所有可能導致內存泄漏的關鍵代碼片段,但是代碼的結構肯定看起來像內存泄漏可能就在眼前。 –

+0

@XaverKapeller什麼是單身人士的問題? – Vyacheslav

回答

-1

首先,這不是單因爲你沒有隱藏的構造。 第二,你需要刪除這一行:

​​

試試這個代碼,它的工作原理確定:

private static CachedObjectsClass singletonInstance = null; 

    HashMap<String, Object> cachedObjects; 

    private CachedObjectsClass() 
    { 
     cachedObjects = new HashMap<>(); 
    } 

    public static CachedObjectsClass getInstance() 
    { 
     singletonInstance = singletonInstance == null ? new CachedObjectsClass() 
       : singletonInstance; 
     return singletonInstance; 
    } 

    public void addObjectToCache(String key, Object object) 
    { 
     cachedObjects.put(key, object); 
    } 

    public Object checkCacheForObject(String title) 
    { 
     return cachedObjects.get(title); 
    } 

與用法:

Object cachedObjectCheck = CachedObjectsClass.getInstance() 
       .checkCacheForObject("kk"); 

    CachedObjectsClass.getInstance().addObjectToCache("l", object); 
+0

爲什麼選擇正確的答案? –