【问题标题】:ImageView memory leak - simple imagesImageView 内存泄漏 - 简单的图像
【发布时间】:2014-05-07 11:15:42
【问题描述】:

我创建了一个类,其任务是将适当的图像与相应的 ImageVew 匹配。

不幸的是,这会导致内存泄漏......

正如 stackoverflow 上的某个人在类似问题中所建议的那样,我将图像从资源转换为位图。

我的班级是这样的:

public ImageAdjuster(Context context, ImageView iv1,
        ImageView iv2, ImageView iv3, ImageView iv4, ImageView iv5,
        ImageView iv6, ImageView iv7) {

    this.iv1 = iv1;
    this.iv2 = iv2;
    this.iv3 = iv3;
    this.iv4 = iv4;
    this.iv5 = iv5;
    this.iv6 = iv6;
    this.iv7 = iv7;
    this.context = context;

    loadAllDrawables();
}

private void loadAllDrawables() {
    imageResourceMap = new HashMap<String, Integer>();

    imageResourceMap.put("image1", R.drawable.image1);
    imageResourceMap.put("image2", R.drawable.image2);
    imageResourceMap.put("image3", R.drawable.image3);
    imageResourceMap.put("image4", R.drawable.image4);
    imageResourceMap.put("image5",
            R.drawable.image5);
    imageResourceMap.put("image6",
            R.drawable.image6);
    imageResourceMap.put("image7",
            R.drawable.image7);


    loadBitmaps();
}

private void loadBitmaps() {
    imageBitmap = new HashMap<String, Bitmap>();
    for (String s : imageResourceMap.keySet()) {
        Bitmap tmp = getBitmapFromRes(imageResourceMap.get(s));

        imageBitmap.put(s, tmp);
    }

    imageResourceMap = null;
}

private Bitmap getBitmapFromRes(int resId) {
    Bitmap tmp = null;
    Bitmap b = null;
    try {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;

        InputStream fis = context.getResources().openRawResource(resId);
        tmp = BitmapFactory.decodeStream(fis, null, o);
        fis.close();

        BitmapFactory.Options o2 = new BitmapFactory.Options();
        fis = context.getResources().openRawResource(resId);
        b = BitmapFactory.decodeStream(fis, null, o2);
        fis.close();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (tmp != null) {
            tmp.recycle();
            tmp = null;
        }
    }
    return b;
}

public void setCorrectImages(Miner miner) {

    iv1.setImageBitmap(imageBitmap.get("image1"));
    iv2.setImageBitmap(imageBitmap.get("image2"));
    iv3.setImageBitmap(imageBitmap.get("image3"));
    iv4.setImageBitmap(imageBitmap.get("image4"));
    iv5.setImageBitmap(imageBitmap.get("image5"));
    iv6.setImageBitmap(imageBitmap.get("image6"));
    iv7.setImageBitmap(imageBitmap.get("image7"));

    iv1.setAdjustViewBounds(true);
    iv2.setAdjustViewBounds(true);
    iv3.setAdjustViewBounds(true);
    iv4.setAdjustViewBounds(true);
    iv5.setAdjustViewBounds(true);
    iv6.setAdjustViewBounds(true);
    iv7.setAdjustViewBounds(true);

}

public void recycleImageBitmaps() {
    for (Bitmap b : imageBitmap.values()) {
        if (b != null) {
            b.recycle();
        }
    }

}

在我的活动中,我回收图像 onDestroy 并初始化它 onCreate

我正在使用 MAT 来定位泄漏点。查看打印屏幕:

图表 嫌疑人 详情

这个分支的每一次打开都指向同一个视图;/

我已经阅读了很多如何解决我的问题的指南,但没有一个对我有帮助

谢谢大家的帮助,当然我的英语很抱歉......

【问题讨论】:

  • 尝试像这样pastie.org/9148591 缩小图像的大小
  • 我有一个非常相似的问题。找到原因了吗?

标签: android image memory-leaks bitmap mat


【解决方案1】:

为什么要将资源转换为位图? android有一种非常有效的资源加载方式,在我看来,只是将图片资源设置为image view应该是非常有效的。

【讨论】:

    猜你喜欢
    • 2012-11-19
    • 2013-08-16
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多