Как обновить элементы пользовательского интерфейса Blackberry из потока? - PullRequest
4 голосов
/ 03 апреля 2010
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");
            }   
        }
    }
}

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

показать text1player
подождите это. длительность миллисекунды
показать text2player
подождите 1000 миллисекунд
показать text3player
Тема закончена.

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

1 Ответ

6 голосов
/ 03 апреля 2010

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

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

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");
            }   
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...