Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Показать splash screen


Автор: gvozd 29.11.2008, 20:28
Здравствуйте.
Помогите, пожалуйста, решить такую задачу. Мидлет при запуске генерирует на форме список. При клике на элементе списка открывается canvas с содержимым, но так как canvas довольно долго открывается, в связи со считыванием данных, хотелось бы после клика отображать заставку, чтоб не создавалось впечатление зависшего приложения. Пробовал сделать следующим образом:
Код

      Display display = Display.getDisplay(this);
      display.setCurrent(splash);
      splash.repaint();

      readCanvas.reset();
      readCanvas.setTitle(__selectedString);
      loadChapter(getLstMainMenu().getSelectedIndex(), __selectedString);
      display.setCurrent(readCanvas);
      readCanvas.repaint();


Но заставка не отображается, а сразу появляется readCanvas. Подскажите, пожалуйста, как отобразить заставку.

Автор: RomkaRomka 2.12.2008, 18:26
Может поможет: отображать заставку прямо из канваса. Добавить в конвас переключатель состояния и в соответствии состояния отрисовывать нужное.

Код

private final int STATE_LOAD = 0;
private final int STATE_WORK = 1;

public void paint(Graphics g)
{
    switch (state) {
        case STATE_LOAD:
            // рисуем заставку
            break;

        case STATE_WORK:
            // рисуем что надо
            break;
    }
}

// если paint вызывается в цикле
public void init()
{
    state = STATE_LOAD;

    // загружаем что надо

    state = STATE_WORK;
}

// если paint не вызывается в цикле
public void init()
{
    state = STATE_LOAD;
    repaint();
    
    // загружаем что надо

    state = STATE_WORK;
    repaint();
}


С уважением, Роман.

Автор: eugine_s 2.12.2008, 19:10
После вот этого:
Код


splash.repaint();



нужно усыпить поток, чтобы дать возможность перерисовать экран.

т.е.
Код

splash.repaint();
try {
Thread.sleep(20);
} catch (Exception e) {}


Добавлено через 10 минут и 36 секунд
RomkaRomka, нет, так не получится. Результат будет аналогичный.

repaint() - это не гарантированная перерисовка экрана. Это только "галочка" для потока перерисовки экрана (*галочка можно читать как -  было бы не плохо перерисовать экран). Но если основной поток занят каким-то "тяжелым" заданием, то поток перерисовки экрана может просто не получить времени для выполнения своего задания. Точнее он получает время для перерисовки экрана, но уже после того как основной поток выполнил задание.

Так же можно попробовать после repaint() вызывать serviceRepaint(). Но все же я рекомендовал бы разобраться с приоритетами потоков.

Автор: gvozd 2.12.2008, 19:31
Всем спасибо, проблема решена. Сделал проще - класс Loader, в который передаются необходимые данные и отрисовывается сплэш, затем в нем через миллисекунду срабатывает таймер, который вызывает чтение данных и их вывод.

Автор: RomkaRomka 2.12.2008, 19:53
Согласен, с repaint() ступил. Есть такая фишка.

С уважением, Роман.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)