代码之家  ›  专栏  ›  技术社区  ›  Light

JavaFX扩展服务<>返回值

  •  0
  • Light  · 技术社区  · 6 年前

    我的应用程序中有任务,我不知道它是如何工作的。

    public class TimeManager extends Service<String> {
    @Override
    protected Task<String> createTask() {
        return new Task<String>() {
            @Override
            protected String call() throws Exception {
                String txt = null;
                while (!isCancelled()) {
                        try {
                            txt = "some txt";
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            System.out.println(e.getMessage());
                        }
                    }
                return txt;
            }
        };
    }
    

    在主课上:

    TimeManager time = new TimeManager();
    time.start();
    time.getValue();
    

    时间总是返回空值。我需要做什么才能返回值? 线程运行良好,我可以将数据从线程发送到应用程序

    1 回复  |  直到 6 年前
        1
  •  3
  •   fabian    6 年前

    您的任务不发布中间更新。此外 Service 用于在后台线程中运行任务,以避免阻塞JavaFX应用程序线程。因此,如果在启动服务后直接访问该值,则很可能不会分配该值。最好使用 value 属性以在分配数据时检索数据。

    public class TimeManager extends Service<String> {
    
        @Override
        protected Task<String> createTask() {
            return new Task<String>() {
    
                int i = 0;
    
                @Override
                protected String call() throws Exception {
                    String txt = null;
                    while (!isCancelled()) {
                        txt = Integer.toString(++i);
                        updateValue(txt); // publish new value
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            System.out.println(e.getMessage());
                        }
                    }
                    return txt;
                }
            };
        }
    }
    
    TimeManager time = new TimeManager();
    label.textProperty().bind(time.valueProperty());
    time.start();
    

    注意,在这种情况下,可能不需要服务,因为您只运行一个任务。运行 Task 实例使用 new Thread(task).start() 可能就足够了。

    此外,还有更好的选项可用于调度GUI的快速重复更新,请参见 JavaFX periodic background task