gpt4 book ai didi

Android:图像缓存策略和内存缓存大小

转载 作者:IT王子 更新时间:2023-10-28 23:32:44 24 4
gpt4 key购买 nike

我正在实现一个用于缓存下载图像的图像缓存系统。

我的策略是基于两级缓存:内存级和磁盘级。

我的类(class)与 droidfu project 中使用的类(class)非常相似。

我下载的图像被放入 HashMap 中,位图对象是包裹在 SoftRererence 对象中。还保存了每个图像永久保存到磁盘。如果请求的图像未在 Hashmap<String,SoftReference<Bitmap>>它将在磁盘上搜索,读取,然后推回 HashMap 中。否则图像会从网络下载的。由于我将图像存储到物理设备内存中,因此我添加了一项检查以保留设备空间并保持在 1M 的占用空间以下:

private void checkCacheUsage() {

long size = 0;
final File[] fileList = new File(mCacheDirPath).listFiles();
Arrays.sort(fileList, new Comparator<File>() {
public int compare(File f1, File f2) {
return Long.valueOf(f2.lastModified()).compareTo(
f1.lastModified());
}
});
for (File file : fileList) {
size += file.length();
if (size > MAX_DISK_CACHE_SIZE) {
file.delete();
Log.d(ImageCache.class.getSimpleName(),
"checkCacheUsage: Size exceeded " + size + "("
+ MAX_DISK_CACHE_SIZE + ") wiping older file {"+file.toString()+"}");
}
}

}

这个方法在磁盘写入之后调用:

Random r = new Random();
int ra = r.nextInt(10);

if (ra % 2 == 0){
checkCacheUsage();
}

我想添加的是对 HashMap 大小的相同检查,以防止它增长太多。像这样的:

private synchronized void checkMemoryCacheUsage(){

long size = 0;

for (SoftReference<Bitmap> a : cache.values()) {

final Bitmap b = a.get();

if (b != null && ! b.isRecycled()){
size += b.getRowBytes() * b.getHeight();
}

if (size > MAX_MEMORY_SIZE){
//Remove some elements from the cache
}

}

Log.d(ImageCache.class.getSimpleName(),
"checkMemoryCacheUsage: " + size + " in memory");

}

我的问题是:什么是正确的 MAX_MEMORY_SIZE 值?另外,这是一个好方法吗?一个好的答案也可能是:“不要这样做!SoftReference 已经足够了”

最佳答案

别这样! SoftReference 已经足够了!实际上,SoftReference 旨在完全满足您的需求。有时 SoftReference 不能满足您的需要。然后你只需摆脱 SoftReference 并编写自己的内存管理逻辑。但就您使用 SoftReference 而言,您不必担心内存消耗,SoftReference 会为您解决。

关于Android:图像缓存策略和内存缓存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3085366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com