Загрузка изображений в J2ME?
-
06-09-2019 - |
Вопрос
Я не новичок в концепциях, представленных в J2ME, но я немного ленив в том, чего не следует делать:В последнее время мое приложение загружало изображения в память, как будто они были конфетками...
Sprite example = new Sprite(Image.createImage("/images/example.png"), w, h);
и я не совсем уверен, что это лучший способ, но на моем Motorola Z6 он работал нормально, до вчерашнего вечера, когда я протестировал приложение на старом мобильном телефоне Samsung, и изображения даже не загружались, и потребовалось несколько попыток запуска потока, чтобы объявиться.Экран остался белым, поэтому я понял, что это должно быть что-то с загрузкой изображения, с которой я не очень хорошо справляюсь...Есть ли кто-нибудь, кто может сказать мне, как правильно выполнить процедуру загрузки в моем приложении?
Решение
Я не уверен, что именно вы ищете, но поведение, которое вы описываете, очень похоже на то, что вы столкнулись с исключением OutOfMemory.Попробуйте уменьшить размеры ваших изображений (использование кучи зависит от размера) и посмотрите, исчезнет ли такое поведение.Это позволит вам узнать, действительно ли это проблема OutOfMemory или что-то еще.
Другие советы:
- Загружайте изображения от большего к меньшему.Это помогает при фрагментации кучи и обеспечивает максимальное пространство в куче для самых больших изображений.
- Выгрузите (установите значение null) в порядке, обратном тому, как вы загружали, и после этого соберите мусор.Обязательно используйте Thread.yield() после вызова GC.
- Убедитесь, что вы загружаете только те изображения, которые вам нужны.Выгрузить изображения из состояния, в котором приложение больше не находится.
- Поскольку вы создаете спрайты, у вас может быть несколько спрайтов для одного изображения.Рассмотрите возможность создания пула изображений, чтобы гарантировать, что вы загружаете изображение только один раз.Затем просто укажите каждому объекту 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;
}
}
Поэтому, когда мне нужно изображение, я сначала запрашиваю его у пула или просто загружаю в пул.