Android:图像缓存策略和内存缓存大小
我正在实现一个图像缓存系统来缓存下载的图像。
我的策略是基于两级缓存: 内存级和磁盘级。
我的类与 droidfu 项目
我下载的图像被放入哈希图中,位图对象是
包装在 SoftRererence 对象内。每张图像也会被保存
永久到磁盘。
如果在搜索中找不到所请求的图像
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 已经足够了”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不要这样做! SoftReference 已经足够了!
实际上,SoftReference 的设计正是为了满足您的需求。
有时 SoftReference 不能满足您的需要。然后你只需摆脱 SoftReference 并编写自己的内存管理逻辑即可。但只要您使用 SoftReference,您就不应该担心内存消耗,SoftReference 会为您做到这一点。
Don't do it! SoftReference is already enough!
Actually SoftReference is designed to do exactly what you need.
Sometimes SoftReference doesn't do what you need. Then you just get rid of SoftReference and write your own memory management logic. But as far as you use SoftReference you should not be worried about memory consumption, SoftReference does it for you.
我将三分之一的堆用于图像缓存。
顺便说一句,关于软引用,在 Android 中软引用并不像你期望的那样工作。存在一个平台问题,即即使有足够的可用内存,软引用也会过早收集。
检查http://code-gotcha.blogspot.com/2011/09/softreference。 html
I am using one-third of the heap for Image cache.
By the way, about soft reference, in Android Soft references do not work as you expect. There is a platform issue that soft references are collected too early, even when there is plenty of memory free.
Check http://code-gotcha.blogspot.com/2011/09/softreference.html
我一直在研究缩放位图的不同缓存机制,包括内存和磁盘缓存示例。这些示例对于我的需求来说很复杂,所以我最终使用 LruCache 制作了自己的位图内存缓存。
您可以查看工作代码示例 此处 或使用此代码:
内存缓存:
BitmapLruCache:
I've been looking into different caching mechanisms for my scaled bitmaps, both memory and disk cache examples. The examples where to complex for my needs, so I ended up making my own bitmap memory cache using LruCache.
You can look at a working code-example here or use this code:
Memory Cache:
BitmapLruCache: