Android:图片缓存策略和内存缓存大小 [英] Android: Image cache strategy and memory cache size

查看:87
本文介绍了Android:图片缓存策略和内存缓存大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实现一个图像缓存系统来缓存下载的图像.

I'm implementing an image cache system for caching downloaded image.

我的策略基于两级缓存: 内存级别和磁盘级别.

My strategy is based upon two-level cache: Memory-level and disk-level.

我的课程非常类似于我下载的图像被放入一个哈希图中,而位图对象是 包装在SoftRererence对象中.每个图像也被保存 永久存储到磁盘. 如果找不到请求的图像 Hashmap<String,SoftReference<Bitmap>>它将在磁盘上搜索, 读取,然后推回到哈希图中.否则图像将是 从网络下载. 由于我将图像存储到物理设备中,因此我添加了一项检查以保留设备空间并保持在1M以下的占用空间中:

My downloaded images are put into an hashmap and the Bitmap objet is wrapped inside a SoftRererence object. Also every image is saved permanently to the disk. If a requested image is not found into the Hashmap<String,SoftReference<Bitmap>> it will be searched on the disk, readed, and then pushed back into the hashmap. Otherwise the image will be downloaded from the network. Since I store the images into the phisical device momery, I have added a check for preserve the device space and stay under a 1M of occupied space:

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()+"}");
            }
        }

    }

此方法有时在磁盘写入后被调用:

This method is called sometime afte a disk writing:

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

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

我要添加的内容是对HashMap大小进行相同的检查,以防止其增长太多.像这样:

What I'd like to add is the same check on the HashMap size to prevent it will grow too much. Something like this:

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已经足够了"

My question is: What could be a right MAX_MEMORY_SIZE value? Also, Is it a good approach? A good answer also could be: "Don't do it! SoftReference is already enough"

推荐答案

不要这样做! 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:图片缓存策略和内存缓存大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆