Как заняться OutOfMemoryError

Когда я пытаюсь загрузить изображения из памяти телефона, я получаю сообщение об ошибке "Недостаточно памяти" java/lang/OutOfMemoryError или nativedecodeImage. Некоторые изображения в памяти телефона имеют размер 12 КД, а другие - около 589 КБ или 600 КБ. Изображения небольшого размера извлекаются в список, но когда дело доходит до изображений большего размера, возникает ошибка OOM.??

Это мой код

FileConnection finalConnection;
 try
    {     
        fc.close();
        finalConnection = (FileConnection) Connector.open(path, Connector.READ_WRITE);
        if(finalConnection.exists())
        {
            InputStream fis = finalConnection.openInputStream();
            long overallSize = finalConnection.fileSize();
            int length = 0;
            byte[] imageData = new byte[0];
            while (length < overallSize)
            {
                byte[] data = new byte[CHUNK_SIZE];
                int readAmount = fis.read(data, 0, CHUNK_SIZE);
                byte[] newImageData = new byte[imageData.length + CHUNK_SIZE];
                System.arraycopy(imageData, 0, newImageData, 0, length);
                System.arraycopy(data, 0, newImageData, length, readAmount);
                imageData = newImageData;
                length += readAmount;
            }
            fis.close();
            finalConnection.close();
            System.out.println("LENGTH IS " + length);
            if (length > 0)
            {                    
                image = Image.createImage(imageData, 0, length);

            }
        }
        else
        {
            System.out.println("NO PATH FOR IMAGE");
        }
    }
 catch (Exception e)
    {
        System.out.println("Image.createImage(imageData, 0, length) " +e.toString());
    }
 catch(Error e)
 {
     System.out.println("Image.createImage " + e);
 }        

Точка, где я получаю ошибку, находится в

image = Image.createImage(imageData, 0, length);

У кого-нибудь есть идеи по этому поводу. Я застрял с этой вещью на несколько дней. Работаю на S40 устройствах Nokia 311. NETbeans MIDP 2.0

2 ответа

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

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

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

Но, может быть, вам не нужно.

Многие камеры производят уменьшенную версию снимков, которые они делают, и включают этот эскиз в данные EXIF. Поэтому, когда вам нужно отобразить список фотографий на телефоне, вы не загружаете целые фотографии. Вы просто загружаете данные миниатюр из данных exif в файл.

Я только экспериментировал с этим, хотя, назад в тот же день. Нашел несколько примеров исходных кодов в Интернете, которые должны были сработать, но это редко работало. Вероятно, это было отчасти потому, что телефоны, которые я тестировал, не сохраняли миниатюру в данных exif. Может быть, Аша 311 делает?

Другие вопросы по тегам