2011-03-25 33 views
1

我的Android應用程序中有一個位圖緩存,位圖通過SoftReference引用。但是,位圖過早消失。緩存中最多可以有20個位圖,如果我加載更多,則GC開始將SoftReferences歸零。沒有SoftReferences,我可以在緩存中擁有大約110個位圖。在OutOfMemoryError發生之前SoftReference是否應該爲null?SoftReference空值過早

回答

5

沒有,寓意作品的其他方式:

這是保證Java運行時會抵消SoftReferences,如果有的話,拋出的OutOfMemoryError之前。但是,它並不能保證只有在這種情況下SoftReference纔會被取消。

+0

是。在Android中,SoftReference的行爲已經從發佈變爲發佈,所以假設當前行爲將持續是不明智的。預計未來的Android版本將包含一個可配置的LruCache工具類,可以幫助解決這類情況。 – fadden 2011-03-26 00:10:41

0

在我的情況下,如果我從其他Activity返回,Hashmap(位圖緩存)會得到空值。 因此,我修正了我的代碼,如下面的僞代碼。

void displayImageFunction() { 
    if(mImageCacheMap.containsKey(key)) { 

     Bitmap bitmapToShow = mImageCacheMap.get(url).get(); 

     if(bitmapToShow != null) { 
      //> Image was cached well 
      //> Set "bitmapToShow" to UI 
      return; 
     } 

    } 

    //> Read from file DB(or Web) and... 
    Bitmap bmp = getBitmap(imageToLoad.url); 

    //> put it to Hashmap again... 
    mImageCacheMap.put(key, new SoftReference<Bitmap>(bmp)); 

    //> Set "bmp" to UI 
} 

我認爲我們應該預先爲零。 因爲我們無法知道GC什麼時候收集垃圾。 :)