user171910
user171910

Reputation:

How do I update blackberry UI items from a thread?

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");
            }   
        }
    }
}

With the above code I'm trying to create a small text player.
Instead to get all the text labels one by one, something like

display text1player
wait this.duration milliseconds
display text2player
wait 1000 milliseconds
display text3player
thread done.

The screens waits this.duration + 1000 milliseconds and displays all the labels at once. I tried with a runnable and calling .invokeLater or .invokeAndWait but I still get the same behavior, and even if I get dirty like above using synchronized it still doesn't work.
Does anyone know how I can display each label at a time?
Thank you!

Upvotes: 4

Views: 4262

Answers (1)

Kiril
Kiril

Reputation: 40395

Try to move the synchronization between the sleep statements... perhaps it's not showing up because you've acquired the lock and the UI thread cannot update while you're sleeping.

Are you seeing a delay or unresponsiveness in the UI while your thread is sleeping? Try it this way:

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");
            }   
        }
    }
}

Upvotes: 6

Related Questions