Вопрос

Я не новичок в концепциях, представленных в J2ME, но я немного ленив в том, чего не следует делать:В последнее время мое приложение загружало изображения в память, как будто они были конфетками...

Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);

и я не совсем уверен, что это лучший способ, но на моем Motorola Z6 он работал нормально, до вчерашнего вечера, когда я протестировал приложение на старом мобильном телефоне Samsung, и изображения даже не загружались, и потребовалось несколько попыток запуска потока, чтобы объявиться.Экран остался белым, поэтому я понял, что это должно быть что-то с загрузкой изображения, с которой я не очень хорошо справляюсь...Есть ли кто-нибудь, кто может сказать мне, как правильно выполнить процедуру загрузки в моем приложении?

Это было полезно?

Решение

Я не уверен, что именно вы ищете, но поведение, которое вы описываете, очень похоже на то, что вы столкнулись с исключением OutOfMemory.Попробуйте уменьшить размеры ваших изображений (использование кучи зависит от размера) и посмотрите, исчезнет ли такое поведение.Это позволит вам узнать, действительно ли это проблема OutOfMemory или что-то еще.

Другие советы:

  1. Загружайте изображения от большего к меньшему.Это помогает при фрагментации кучи и обеспечивает максимальное пространство в куче для самых больших изображений.
  2. Выгрузите (установите значение null) в порядке, обратном тому, как вы загружали, и после этого соберите мусор.Обязательно используйте Thread.yield() после вызова GC.
  3. Убедитесь, что вы загружаете только те изображения, которые вам нужны.Выгрузить изображения из состояния, в котором приложение больше не находится.
  4. Поскольку вы создаете спрайты, у вас может быть несколько спрайтов для одного изображения.Рассмотрите возможность создания пула изображений, чтобы гарантировать, что вы загружаете изображение только один раз.Затем просто укажите каждому объекту Sprite на изображение в пуле, которое ему требуется.Ваш пример в вашем вопросе выглядит так, будто вы, скорее всего, загрузите одно и то же изображение в память более одного раза.Это расточительно и может быть частью проблемы OutOfMemory.

Другие советы

Используйте изображение фильма (набор изображений определенного размера в одном изображении) и используйте логику для извлечения их по одному.

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

Этот метод был впервые использован в устройствах с ограниченным объемом памяти MIDP 1.0.

Используя подход Фоста, заключающийся в отказе от загрузки изображений снова и снова, я создал следующий класс:

public class ImageLoader {
    private static Hashtable pool = new Hashtable();

    public static Image getSprite(String source){
        if(pool.get(source) != null) return (Image) pool.get(source);
        try {
            Image temp = Image.createImage(source);
            pool.put(source, temp);
            return temp;
        } catch (IOException e){
            System.err.println("Error al cargar la imagen en "+source+": "+e.getMessage());
        }
        return null;
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top