从UI JavaFX中收听后台线程

时间:2015-03-15 18:48:54

标签: java multithreading concurrency javafx javafx-2

我有一个问题。我正在为桌面创建JavaFX应用程序。我的应用程序中有线程在后台运行,我们假设它是从互联网上下载文件 我已经阅读了有关JavaFX中并发性的文章。有特殊的课程任务。我用Task扩展了我的课程。但它只会返回一些价值,之后就会关闭 但我需要在所有应用程序生命周期内运行此任务,并且当例如下载文件时,它应该将结果发布到UI线程,更准确地说是控制器,然后更新某些ui组件。
我知道Task有updateProgress方法,也许我可以绑定它不仅可以接收整数,还可以绑定复杂的对象 或者在我的案例中还有其他好的方法 请帮助解决这个问题。

2 个答案:

答案 0 :(得分:2)

JavaFX为您提供ScheduledService,可以安排重复性工作。 javadoc说,

  

ScheduledService是一个将自动重启的服务   在成功执行之后,在某些条件下会   即使发生故障也要重启。

一个非常简单的例子是:

ScheduledService<Object> service = new ScheduledService<Object>() {
     protected Task<Object> createTask() {
         return new Task<Object>() {
             protected Object call() {
                 // Connect to a Server
                 // Download the object
                 updateProgress(...);
                 return object; // Useful in case you want to return data, else null
             }
         };
     }
 };
 service.setPeriod(Duration.seconds(10)); //Runs every 10 seconds
 //bind the service progress/message properties
 progressBar.progressProperty().bind(service.progressProperty());

还有非javafx方法可以实现这一点,您可以使用:

答案 1 :(得分:1)

这里最简单的方法是使用普通的旧线程:

// create new thread at start, e.g. at the end for Application.start() method
new Thread(new Runnable() {
  public void run() {
      while(true) {
           //load my data 
           // once loaded
           // update UI using 
           Platform.runLater(new Runnable() {
               public void run() {
                   // here goes my update on FX UI thread
               }
           });
           // update is done let's look for more data
      }
  }
}).start();