ImageView内存泄漏 - 简单的图像

时间:2014-05-07 11:15:43

标签: android image memory-leaks bitmap mat

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

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

正如stackoverflow上有人在类似问题中提出的那样,我将图像从Resources转换为Bitmaps。

我的班级看起来像这样:

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找到泄漏点。看看printscreens:

Diagram嫌疑人 Suspects详情 Details Details

此分支的每个开口都会显示相同的视图; /

我已经阅读了很多指南如何解决我的问题,但他们都没有帮助我

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

1 个答案:

答案 0 :(得分:1)

为什么要将资源转换为位图? android有一种非常有效的加载资源的方法,在我看来,将图像资源设置为图像视图应该非常有效。