Утечка памяти ImageView - простые изображения

Я создал класс, задача которого - сопоставить соответствующие изображения с соответствующими изображениями 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 для определения места утечки. Посмотрите на печатные экраны:

Диаграмма DiagramПодозреваемые  Подозреваемые Подробности Подробности Подробности

Каждое открытие этой ветки ведет к одному и тому же виду; /

Я прочитал много руководств, как решить мою проблему, но ни одно из них мне не помогло.

Спасибо всем за любую помощь, и, конечно, извините за мой английский ...


person Lau    schedule 07.05.2014    source источник
comment
попробуйте уменьшить размер таких изображений pastie.org/9148591   -  person Addy    schedule 07.05.2014
comment
У меня очень похожая проблема. Вы нашли причину?   -  person Loc    schedule 18.10.2014


Ответы (1)


Зачем преобразовывать ресурсы в растровые изображения? В android есть очень эффективный способ загрузки ресурсов, на мой взгляд, просто установка ресурса изображения для просмотра изображения должна быть очень эффективной.

person elmorabea    schedule 07.05.2014