Загрузка изображений в J2ME? - PullRequest
2 голосов
/ 28 мая 2009

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

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

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

Ответы [ 3 ]

4 голосов
/ 29 мая 2009

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

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

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

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

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

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

0 голосов
/ 29 мая 2009

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

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;
    }
}

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

...