2013-11-25 141 views
0

我正在處理大量小型位圖,其中大約有100個。但他們是非常小的縮略圖大小的圖像。我的設計是這樣的,我從服務器上下載列表並將它們保存在本地文件系統中。當用戶需要一個位圖,我做緩存已存儲在文件系統上的解碼位圖

BitmapFactory.decodeFile(pathName); 

我的問題主要是:我應該緩存解碼位圖?因此,下次撥打電話時,不必再次解碼,我可以返回已解碼的圖像。在某些情況下,這些位圖會在我的應用程序中使用,所以解碼的調用頻繁。但另一方面,我會緩存大約100個位圖。因此,新的代碼將

if(null == bitmap) 
    return (bitmap = BitmapFactory.decodeFile(pathName)); 
else return bitmap; 

有人可以請您談談對新設計的成本/收益的空間/時間複雜度,性能,完善的設計,這樣的條款?此外,位圖通常顯示在ListView中。

爲什麼從@dumazy響應不是我的情況很明顯:

當我從服務器上下載,我的元數據存儲在一個HashMap:

Map<String,MyIcon> myIcons … 

和MyIcons類是這樣的:

class MyIcon{ 

    String filepath;//path of image on local filesystem. 
    String url;// url to where image is on server 
    Bitmap myImage;// for caching so not to decode each time 
    ...//other fields about the icon 

//then a number of methods 
} 
從我的角度

所以,用LruCache會意味着創建內部m的靜態嵌套類擴展LruCache, yIcon。然後,對於MyIcon的每個實例,當位圖從LruCache中逐出時,我需要確保將關聯的myImage設置爲null。這看起來很複雜,我甚至不確定它會起作用。也許這裏的Java專家可以告訴我如何知道它是否工作,我應該實現它。

回答

1

位圖解碼需要相當長的時間。最佳做法是使用LruCache。 查看本教程here

由於您使用的是ListView,因此只能在適配器的getView()方法中加載它們。另外使用AsyncTask加載它們初始化

+0

感謝您的文章,這是一個很好的閱讀。但我不太確定這對我來說是最好的解決方案。但根據你的回答,似乎我應該限制我擁有的緩存位圖的數量。我會在重構中考慮這一點。 +1。 –

相關問題