java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины - PullRequest
7 голосов
/ 18 октября 2010

Итак, у меня есть ленивый загрузчик изображений для моего ListView. Я также использую этот учебник для лучшего управления памятью и храню SoftReference растровые изображения в моем ArrayList.

Мой ListView работает, загружает 8 изображений из БД, затем, как только пользователь прокручивает до самого дна, он загружает еще 8 и т. Д. И т. Д. Не было проблем, когда было около 35 изображений или меньше, но больше и мой Приложение Force закрывается с OutOfMemoryError.

Что я не могу понять, так это то, что у меня есть код внутри try-улова:

try
{
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;
    BitmapFactory.decodeByteArray(image, 0, image.length, o);

    //Find the correct scale value. It should be the power of 2.
    int width_tmp = o.outWidth, height_tmp = o.outHeight;
    int scale = 1;

    while(true)
    {
        if(width_tmp/2 < imageWidth || height_tmp/2 < imageHeight)
        {
            break;
        }

        width_tmp/=2;
        height_tmp/=2;
        scale++;
    }

    //Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    bitmapImage = BitmapFactory.decodeByteArray(image, 0, image.length, o2);        
}
catch (Exception e)
{
    e.printStackTrace();
}

Но блок try catch не перехватывает исключение OutOfMemory, и, насколько я понимаю, растровые изображения SoftReference следует очищать, когда в приложении заканчивается память, останавливая создаваемое исключение OutOfMemory.

Что я здесь не так делаю?

Ответы [ 3 ]

9 голосов
/ 12 января 2011

Полагаю, этот пост поможет вам

//decodes image and scales it to reduce memory consumption
private Bitmap decodeFile(File f){
    try {
        //Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f),null,o);

        //The new size we want to scale to
        final int REQUIRED_SIZE=70;

        //Find the correct scale value. It should be the power of 2.
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    } catch (FileNotFoundException e) {}
    return null;
}
4 голосов
/ 18 октября 2010

OutOfMemoryError - ошибка, не исключение, вы не должны ее ловить.

см. http://mindprod.com/jgloss/exception.html

РЕДАКТИРОВАТЬ: известная проблема см. эта проблема

0 голосов
/ 03 октября 2015

Ошибка и исключение подклассы из Throwable. Предполагается, что ошибки настолько радикальны, что их не поймать.

Но вы можете поймать что угодно.

try
{ 
}
catch (Throwable throwable)
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...