我正在我的应用程序中实现一个图像文件缓存,以减少直接从web服务器下载这些文件的次数。虽然我知道Android操作系统可能会决定从我的应用程序的缓存目录中清除文件以释放内部存储空间,但我不太确定这种“清理”过程是否会在其执行过程中发生。如果我可以假设操作系统在执行过程中不会弄乱缓存的文件,我就能够使用“在内存中”的数据结构来优化我的缓存实现。例如,我可以使用缓存条目(存储在缓存文件夹中的文件)的映射(在内存中),其中包含缓存命中的时间戳和其他信息,这些信息可能对确定缓存条目回收方式的优先顺序很有用。否则,如果我必须处理缓存清理过程可能随时随地发生的事实,甚至在应用程序执行期间,使用内存中的数据结构将是无用的,因为在操作系统决定自行清理文件的情况下,它们最终将与文件夹的真实内容不同步。在这种情况下,我的缓存系统将不得不降低效率,因为每当应用程序请求新文件时,它都会被迫直接在文件系统中检查缓存文件夹的内容。换句话说,我只想知道我是否可以假设缓存目录的内容不会被操作系统与我的应用程序并发地更改,因为这可能会显著改变我的缓存实现。
发布于 2014-11-18 12:43:10
只需使用普通方法删除缓存目录中的所有文件
public void clear() {
File[] directory = getCacheDir().listFiles();
if(directory != null){
for (File file : directory ){
file.delete();
}
}
}发布于 2014-11-18 13:44:15
在应用程序运行时,您可以分配新的对象,这些对象将保留在RAM上,不会被页出,因此您必须通过释放对象引用来从应用程序中释放内存,使内存可供垃圾收集器使用,但是如果有任何未修改的文件,如果系统希望在其他地方使用该内存,则可能会将其从RAM中页出。因此,这将是一个更好的方法来处理您的内存管理,而不是驻留在系统上。您可以执行以下操作:
Set<SoftReference<Bitmap>> mReusableBitmaps = Collections.synchronizedSet(new HashSet<SoftReference<Bitmap>>());
LruCacheString mMemoryCache = new LruCache<String, BitmapDrawable>(mCacheParams.memCacheSize) {
@Override
protected void entryRemoved(boolean evicted, String key,
BitmapDrawable oldValue, BitmapDrawable newValue) {
if (RecyclingBitmapDrawable.class.isInstance(oldValue)) {
((RecyclingBitmapDrawable) oldValue).setIsCached(false);
} else {
if (Utils.hasHoneycomb()) {
mReusableBitmaps.add
(new SoftReference<Bitmap>(oldValue.getBitmap()));
}
}
}如果您确定现在不再使用这些位图,则可以按如下方式删除它们:
if (mReusableBitmaps != null && !mReusableBitmaps.isEmpty()) {
synchronized (mReusableBitmaps) {
final Iterator<SoftReference<Bitmap>> iterator
= mReusableBitmaps.iterator();
Bitmap item;
while (iterator.hasNext()) {
item = iterator.next().get();
if (null != item && item.isMutable()) {
if (canUseForInBitmap(item, options)) {
bitmap = item;
iterator.remove();
break;
}
} else {
iterator.remove();
}
}
}
}你也可以使用picasso,这将管理你所有的位图缓存
https://stackoverflow.com/questions/26986637
复制相似问题