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

标签 android memory caching bitmap

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

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

我的类(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/

相关文章:

android - 在 Android Studio 中开发同一个应用的两个版本

android - 如何将键值对存储在将存储在Android内部存储器中的文件中?

django - 为 django 项目安装 memcached

ruby-on-rails - 为什么 Rails 缓存会检查每个页面请求的 URL?

python - 在 I/O 跟踪文件中查找缓存未命中、命中率

java - Android Fragment 简单按钮

java - 根据语言环境输出日期

android - 如何将 json 字符串解码为 UTF-8?

c++ - 为什么我们需要在 C++ 中显式声明指针类型?

c++ - 从结构到 LPVOID 的类型转换