Я работаю над приложением J2ME, которое следует портировать на разные телефоны поставщиков. Пока приложение работает нормально, за исключением Motorola V3 (это единственный телефон Motorola, который я пробовал).Рабочий поток не смог обновить пользовательский интерфейс на Motorola V3
Проблема заключается в том, что при запуске нового потока, и когда поток пытается обновить графику (вызывая перерисовку()), графическая система представляет собой стек.
Некоторая полезная информация: - Я получаю дисплей в конструкторе Мидлета и повторно использую его во время срока службы приложения. - Существует только один класс, расширяющий холст. Каждый рисунок происходит здесь. Когда я хочу перерисовать графику, я вызываю метод repaint() либо из потока пользовательского интерфейса, либо из другого потока Worker. Насколько я знаю, каждый поток может получить доступ к пользовательскому интерфейсу без проблем. - Я попытался исправить ситуацию, когда в начале приложения я беру имя потока (UI) и сохраняю его для последующего использования. Перед вызовом repaint() я проверяю, совпадает ли имя текущего потока с именем потока пользовательского интерфейса. Если оды, то я repaint()
, иначе я:
display.callSerially(new Runnable() {
public void run() {
repaint();
}
});
Можете ли вы указать мне какие-либо особенности в реализации внешних Моторола о J2ME? Как я могу решить эту проблему с потоками, обновляющими интерфейс?
Спасибо, Златко
Спасибо за ваш ответ. Мой первоначальный подход состоял в том, чтобы напрямую обновлять пользовательский интерфейс из рабочего потока, как вы предлагаете, имея в виду спецификацию, о которой вы упомянули. Он не работал. Вот что побудило меня искать другие решения (в том числе тот, который я написал в своем посте). – Bart
Чтобы сделать мой прецедент более понятным: есть изображение, отображаемое при запуске приложения с целью заставки. В этот момент я создаю новую тему, которая ждет 5 секунд, затем изменяет изображение, которое должно использоваться методом paint(), и вызывает repaint(). Однако второе изображение никогда не появляется, но первое (всплеск). Кажется, что repaint() не выполняется во второй раз или блокируется (этот код отлично работает на многих других устройствах). Есть идеи? – Bart
Возможно, поток событий заблокирован. Можете ли вы показать нам код? –