【问题标题】:90MB heap size when loading drawables加载可绘制对象时堆大小为 90MB
【发布时间】:2014-03-22 19:26:57
【问题描述】:

我想显示来自用户设备的一些图像的预览。为此,我在外部存储中搜索图像文件,并在每个包含一些文件的文件夹中,在列表视图中列出文件夹的名称和来自该文件夹的图像。 在我的 Nexus 上有 6 个包含图像的文件夹,所以我有 6 个列表视图项目。 我使用以下方式加载所有图像:

Drawable.createFromPath(file.getAbsolutePath())

并将生成的drawable缓存在HashMap中,以防止多次加载相同的图像。

但是,堆从 20MB 增长到 >90MB。加载图像时,应用程序响应会延迟 2 秒。很糟糕。

我不知道堆是如何从 6 个 50KB 的图像增长到 90MB 的。为了解决这个问题,我尝试从图像中加载二次采样位图 - 但是每当我加载它们时,我都会遇到内存不足的异常。

我已多次验证加载的图像不超过这 6 张。 我能做什么?

【问题讨论】:

    标签: android image memory


    【解决方案1】:

    您应该做的是使用 MAT 工具分析您的应用程序的内存使用情况,如this 惊人的文章中所述。该工具将帮助您识别潜在的内存泄漏,并查看究竟是什么触发了堆增长。

    【讨论】:

      【解决方案2】:

      我使用了 Egor 描述的工具,没有内存泄漏。这些图像占用了大约 30MB 堆。这个数量只能通过减小图像尺寸来减少。我的解决方案使用二次采样,现在占用大约 3MB 堆空间。

      private Drawable loadDrawable(Context context, File file) {
              Drawable drawable = drawables.get(file);
              if (drawable == null) {
                  final int targetSize = 500;
      
                  // get subsampling factor
                  Options opts = new Options();
                  opts.inJustDecodeBounds = true;
                  BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
                  int largest = opts.outWidth > opts.outHeight ? opts.outWidth : opts.outHeight;
                  float factor = largest / (float) targetSize;
                  factor = Math.round(factor);
      
                  // load bitmap with subsampling
                  opts = new Options();
                  opts.inSampleSize = (int) factor;
                  Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), opts);
                  drawable = new BitmapDrawable(getResources(), bitmap);
                  drawables.put(file, drawable);
              }
              return drawable;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 2018-09-07
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多