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

Fra*_*ita 11 memory android caching bitmap

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

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

我的课程类似于droidfu项目中使用的课程

我下载的图像被放入一个hashmap,Bitmap对象被包装在一个SoftRererence对象中.此外,每个图像都永久保存到磁盘.如果未找到所请求的图像 Hashmap<String,SoftReference<Bitmap>>,则将在磁盘上搜索该图像,重新加入,然后将其推回到散列图中.否则,图像将从网络下载.由于我将图像存储到物理设备momery中,因此我添加了一个检查以保留设备空间并保持在占用空间的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()+"}");
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

在磁盘写入后的某个时候调用此方法:

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

        if (ra % 2 == 0){
            checkCacheUsage();
        }
Run Code Online (Sandbox Code Playgroud)

我想添加的是对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");

    }
Run Code Online (Sandbox Code Playgroud)

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

Fed*_*dor 8

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