Как обновить элементы пользовательского интерфейса Blackberry из потока?

public class PlayText extends Thread {

   private int duration;
   private String text;
   private PlayerScreen playerscrn; 

   public PlayText(String text, int duration) {
        this.duration = duration;
        this.text = text;
        this.playerscrn = (PlayerScreen)UiApplication.getUiApplication().getActiveScreen();
   }



    public void run() {
        synchronized(UiApplication.getEventLock()) {
            try{
                RichTextField text1player = new RichTextField(this.text, Field.NON_FOCUSABLE);
                playerscrn.add(text1player);
                playerscrn.invalidate();

                Thread.sleep(this.duration);

                RichTextField text2player = new RichTextField("hahhaha", Field.NON_FOCUSABLE);
                playerscrn.add(text2player);
                playerscrn.invalidate();

                Thread.sleep(1000);
                RichTextField text3player = new RichTextField("Done", Field.NON_FOCUSABLE);
                playerscrn.add(text3player);
                playerscrn.invalidate();

            }catch(Exception e){
             System.out.println("I HAVE AN ERROR");
            }   
        }
    }
}

С помощью приведенного выше кода я пытаюсь создать небольшой текстовый проигрыватель.
Вместо того, чтобы получать все текстовые метки одну за другой, что-то вроде

display text1player
wait this.duration миллисекунды
отобразить text2player
подождать 1000 миллисекунд
отобразить text3player
поток выполнен.

Экраны ждут this.duration + 1000 миллисекунд и отображают все метки в однажды. Я пробовал с runnable и вызывал .invokeLater или .invokeAndWait, но все равно получаю то же поведение, и даже если я испачкаюсь, как указано выше, используя синхронизированный, он все равно не работает.
Кто-нибудь знает, как я могу отображать каждую метку за раз?
Спасибо!


person Community    schedule 02.04.2010    source источник


Ответы (1)


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

Вы видите задержку или отсутствие отклика в пользовательском интерфейсе, когда ваш поток спит? Попробуйте так:

public class PlayText extends Thread {

   private int duration;
   private String text;
   private PlayerScreen playerscrn; 

    public PlayText(String text, int duration) {
        this.duration = duration;
        this.text = text;
        this.playerscrn = (PlayerScreen)UiApplication.getUiApplication().getActiveScreen();
    }

    private void displayTextLabel(string textToDisplay){
        synchronized(UiApplication.getEventLock()) {
            playerscrn.add(new RichTextField(textToDisplay, Field.NON_FOCUSABLE));
            playerscrn.invalidate();
        }
    }

    public void run() {

            try{

                displayTextLabel(this.text);
                Thread.sleep(this.duration);

                displayTextLabel("hahhaha");
                Thread.sleep(1000);

                displayTextLabel("Done");

            }catch(Exception e){
             System.out.println("I HAVE AN ERROR");
            }   
        }
    }
}
person Kiril    schedule 02.04.2010
comment
Это работает, спасибо! Читал-читал BB docs уже два дня и ничего не нашел, stackoverflow спас часть моих нейронов. - person ; 03.04.2010
comment
Раньше я говорил, что Google — твой друг, но с тех пор, как я пришел в stackoverflow, я решил сказать, что stackoverflow — твой ЛУЧШИЙ друг! :) - person Kiril; 03.04.2010