我现在在我的应用程序中尝试做的是修改谷歌去年在他们的一个教程中推出的ImageDownloader类,该类异步下载和缓存 ImageViews 的图像而不会泄露上下文。
换句话说,由于我正在使用一个全局缓存单例对象,它提供对我的位图 HashMaps 的引用,我只需要知道:因为我必须根据我的应用程序的某些方面(客户端要求)分别缓存图像,我应该有每种类型的位图都有一对硬和软 HashMap,或者只有一个软 HashMap,当其他硬缓存被按下空间时将它们的文件移动到其中,效率会更高吗?
我现在在我的应用程序中尝试做的是修改谷歌去年在他们的一个教程中推出的ImageDownloader类,该类异步下载和缓存 ImageViews 的图像而不会泄露上下文。
换句话说,由于我正在使用一个全局缓存单例对象,它提供对我的位图 HashMaps 的引用,我只需要知道:因为我必须根据我的应用程序的某些方面(客户端要求)分别缓存图像,我应该有每种类型的位图都有一对硬和软 HashMap,或者只有一个软 HashMap,当其他硬缓存被按下空间时将它们的文件移动到其中,效率会更高吗?
我在我们开发的应用程序上遇到了类似的问题。我们硬缓存我们在 SQLite blob 中提取的图像。包装器将检查缓存的存在,或者通过网络拉取,因此即使有人清除了应用程序数据,它也会起作用(在图像再次缓存之前会慢一点)。由于它在 SQLite 中,因此应用程序数据可以轻松地移动到 SD 卡并返回,而不必担心文件路径被更改。
考虑使用类似的东西:
ConcurrentHashMap<String, SoftReference<Bitmap>> image_cache =
newConcurrentHashMap<String, SoftReference<Bitmap>>( 1 );
对于缓存的内存部分。当设备需要内存时,SoftReference 将被垃圾收集。这将允许您的应用程序在内存中保留尽可能多的图像,而不会导致内存问题。
您可以选择使用带有根路径的 SD 卡上的文件缓存来支持此缓存,方法是:
Environment.getExternalStorageDirectory();
或使用 android 提供的缓存空间,路径为:
context.getCacheDir();
缓存空间是私有的,因此 SD 卡图像可以由用户检索或由 3rd 方程序修改。缓存空间位于设备的内部存储中,并显示在应用程序管理器统计信息中。用户还可以从他们的设置->应用程序管理器屏幕轻松清除此缓存。
您需要填写算法,首先检查内存缓存,如果找到则检查软引用,如果没有找到则检查文件系统,最后从网络中获取,保存到文件中,并将其放入内存缓存中. 然后,您可以在此结构之上根据您的客户端要求为缓存添加其他要求。