2013-11-25 89 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。 –

相关问题