java - 如何从线程更新黑莓 UI 项目?

标签 java blackberry multithreading uilabel

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
等待 this.duration 毫秒
显示文本播放器
等待 1000 毫秒
显示 text3player
线程完成。

屏幕等待 this.duration + 1000 毫秒并立即显示所有标签。 我尝试使用 runnable 并调用 .invokeLater 或 .invokeAndWait 但我仍然得到相同的行为,即使我像上面那样使用 synchronized 变得肮脏它仍然不起作用。
有谁知道我如何一次显示每个标签?
谢谢!

最佳答案

尝试在 sleep 语句之间移动同步......也许它没有出现是因为你已经获得了锁并且 UI 线程在你 sleep 时无法更新。

您是否在线程 hibernate 时看到 UI 出现延迟或无响应?以这种方式尝试:

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

关于java - 如何从线程更新黑莓 UI 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2569468/

相关文章:

java - 如何创建 react 性 'intermediate subscriber' ?如何将所有 Flux<T> 部分和它们的处理结果在链中进一步组合(转换为 Mono<R>)?

user-interface - 如何导航回黑莓中的上一个屏幕?

blackberry - 什么样的代码可以让黑莓消耗大量电池电量?

java - sleep 的理发师,信号量?

java - JBDC - 跨并发线程以原子方式执行 SELECT 和 INSERT

java - 在 junit 测试中通过 URL 提供 stub 文件 -wiremock

java - 如何在我的应用程序中显示小部件的选择列表?

java - 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

blackberry - 在 Eclipse 的 BlackBerry JDE 插件中使用预处理器指令?

c++ - 循环将执行分为几个线程(1-N-1-N-1…)