Android图像缓存 - 硬和软HashMaps问题

时间:2011-08-16 15:24:24

标签: android caching bitmap hashmap soft-references

我在我的应用程序中正在尝试做的是修改Google去年在他们的一个教程中推出的ImageDownloader课程,这些教程异步下载并缓存ImageViews的图像,而不会泄露上下文。

换句话说,因为我正在使用一个全局缓存单例对象来提供对我的Bitmap HashMaps的引用,所以我只需要知道:因为我必须根据应用程序的某些方面(客户端要求)单独缓存图像,我是否应该为每种类型的位图配备硬和软HashMaps对,或者只有一个软HashMap更有效率,其他硬缓存在按下空格时将文件移动到哪里?

2 个答案:

答案 0 :(得分:0)

我在我们处理的应用上遇到过类似的问题。我们很难缓存我们在SQLite blob中提取的图像。包装器将检查缓存的存在,或者通过网络拉动,所以即使有人清除了应用程序数据,它也会起作用(在图像再次缓存之前会慢一点)。由于它在SQLite中,因此可以轻松地将应用程序数据移动到SD卡并返回,而无需担心文件路径被更改。

答案 1 :(得分:0)

考虑使用以下内容:

ConcurrentHashMap<String, SoftReference<Bitmap>> image_cache =
newConcurrentHashMap<String, SoftReference<Bitmap>>( 1 );

用于缓存的内存部分。 SoftReference将被垃圾收集,因为设备需要内存。这将允许您的应用程序在内存中保留尽可能多的图像,而不会导致内存问题。

您可以选择使用以下路径在SD卡上使用文件缓存备份此缓存:

Environment.getExternalStorageDirectory();

或使用android提供的缓存空间使用路径:

context.getCacheDir(); 

缓存空间是私有的,因此SD卡图像可以由用户检索或由第三方程序修改。缓存空间位于设备的内部存储上,并显示在应用程序管理器统计信息中。用户还可以从其设置&gt;应用程序管理器屏幕轻松清除此缓存。

您需要先填写检查内存缓存的算法,检查找到的软引用,检查文件系统是否找不到,然后最后从网络中提取,保存到文件中,然后将其放入内存缓存。然后,您可以根据此结构之上的客户端要求为缓存添加其他要求。